RDF4j ShaclSailValidationException 将 sh:targetNode 与 sh:minCount 一起使用时

问题描述 投票:0回答:1
添加带有

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
1个回答
0
投票

之所以会引发异常,是因为 RDF4J 实现的前提是目标节点实际上不必存在于图中才会违反形状。因此,图中缺少节点会导致违规。

在提交 SHACL 规则之前向图中添加符合要求的节点不会引发异常。

查看更多:https://github.com/eclipse-rdf4j/rdf4j/issues/5138

© www.soinside.com 2019 - 2024. All rights reserved.