DELETE {
  ?bnode ?outP ?outO .
  ?inS ?inP ?bnode .
}
INSERT {
  ?iri ?outP ?outO .
  ?inS ?inP ?iri .
}
WHERE {
  {
    SELECT ?bnode ?iri
    WHERE {
      {
        SELECT ?bnode
               (SAMPLE(?_class) AS ?class)
               (SHA1(CONCAT(GROUP_CONCAT(STR(?p); separator = ""),
                            GROUP_CONCAT(STR(?o); separator = ""))) AS ?hash)
        WHERE {
          ?bnode ?p ?o .
          FILTER isBlank(?bnode)
          OPTIONAL {
            ?bnode a ?_class .
          }
        }
        GROUP BY ?bnode
      }
      # Your base namespace for resources: 
      BIND ("http://linked.opendata.cz/resource/" AS ?ns)
      # Extract the local name of the resource's class and convert it to kebab-case.
      BIND (LCASE(REPLACE(COALESCE(REPLACE(STR(?class), "^.*[/#]([^/#]+)$", "$1"), "thing"),
                          "(\\p{Ll})(\\p{Lu})", "$1-$2"))
           AS ?classLocalName)
      # The newly minted hash-based IRIs follow the pattern {namespace}/{class name}/{hash}.
      BIND (IRI(CONCAT(?ns, ?classLocalName, "/", ?hash)) AS ?iri)
    }
  }
  ?bnode ?outP ?outO .
  OPTIONAL {
    ?inS ?inP ?bnode .
  }
}