SailRepositoryConnection
且
ShaclSailValidationException
>0 的 SHACL 规则时,RDF4J
connection.commit()
会在 sh:targetNode
中抛出 sh:minCount
。当不使用 sh:minCount
或 sh:minCount 0
时,该问题就会消失。有谁知道可能是什么问题吗?
例外:
org.eclipse.rdf4j.sail.shacl.ShaclSailValidationException: Failed SHACL validation
org.eclipse.rdf4j.repository.RepositoryException: org.eclipse.rdf4j.sail.shacl.ShaclSailValidationException: Failed SHACL validation
at org.eclipse.rdf4j.repository.sail.SailRepositoryConnection.commit(SailRepositoryConnection.java:228)
at ch.unisg.ics.interactions.hmas.interaction.validation.ShaclValidationTest.testContextValidationRDF4j(ShaclValidationTest.java:178)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
Caused by: org.eclipse.rdf4j.sail.shacl.ShaclSailValidationException: Failed SHACL validation
at org.eclipse.rdf4j.sail.shacl.ShaclSailConnection.prepare(ShaclSailConnection.java:892)
at org.eclipse.rdf4j.repository.sail.SailRepositoryConnection.commit(SailRepositoryConnection.java:225)
代码示例:
String shaclRules = "@prefix sh: <http://www.w3.org/ns/shacl#> .\n" +
"@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .\n\n" +
"<http://example.org/component/component-state-context>\n" +
" a sh:PropertyShape;\n" +
" sh:targetNode <http://example.org/component>;\n" +
" sh:path <https://saref.etsi.org/core/hasState>;\n" +
" sh:maxCount 1;\n" +
" sh:minCount 1." ;
ShaclSail shaclSail = new ShaclSail(new MemoryStore());
SailRepository sailRepository = new SailRepository(shaclSail);
sailRepository.init();
try (SailRepositoryConnection connection = sailRepository.getConnection()) {
connection.begin();
connection.add(new StringReader(shaclRules), "", RDFFormat.TURTLE, RDF4J.SHACL_SHAPE_GRAPH);
connection.commit();
}
之所以会引发异常,是因为 RDF4J 实现的前提是目标节点实际上不必存在于图中才会违反形状。因此,图中缺少节点会导致违规。
在提交 SHACL 规则之前向图中添加符合要求的节点不会引发异常。