我想使用新语义来验证 Neo4j 中的图形,但我在将模型约束加载到最小示例上时遇到困难:
假设我有以下图表:
CREATE (n:Person {name: 'Andy'})
然后,我按如下方式初始化新语义:
CALL n10s.graphconfig.init();
现在我应该可以去验证图表了。根据我在这里找到的内容(https://neo4j.com/labs/neosemantics/4.0/validation/), 我认为以下模式应该作为第一种方法:
call n10s.validation.shacl.import.inline('
@prefix neo4j: <http://neo4j.com/myvoc#> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
neo4j:PersonShape a sh:NodeShape ;
sh:targetClass neo4j:Person ;
sh:property [
sh:path neo4j:name ;
sh:datatype xsd:string ;
];
.','Turtle')
但是,这给了我:
Failed to invoke procedure `n10s.validation.shacl.import.inline`: Caused by: n10s.utils.UriUtils$UriNamespaceHasNoAssociatedPrefix: Prefix Undefined: No prefix defined for namespace <http://neo4j.com/myvoc#Person>. Use n10s.nsprefixes.add(...) procedure.
感觉很奇怪,但为了匹配该错误消息,我尝试添加该行
@prefix neo4jPerson: <http://neo4j.com/myvoc#Person> .
但这并没有帮助。
然后我尝试了以下方法:
CALL n10s.graphconfig.init({handleVocabUris:"IGNORE"});
然后,验证规则被接受,但它看起来并没有真正与任何东西相关:
target propertyOrRelationshipPath param value
"__NONE__" "__NONE__" "datatype" "string"
我认为删除命名空间的东西会很有帮助。所以我也尝试过
call n10s.validation.shacl.import.inline('
@prefix neo4j: <http://neo4j.com/myvoc#> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
PersonShape a sh:NodeShape ;
sh:targetClass Person ;
sh:property [
sh:path name ;
sh:datatype xsd:string ;
];
.','Turtle')
但这也不起作用,因为解析器坚持让命名空间的东西发挥作用:
Failed to invoke procedure `n10s.validation.shacl.import.inline`: Caused by: org.eclipse.rdf4j.rio.RDFParseException: Expected ':', found ' ' [line 6]
我有点不知所措。我给出的代码或多或少取自新语义用户指南(https://neo4j.com/labs/neosemantics/4.0/)。 并且只是稍微适应了。他们的单元测试似乎也没有添加任何魔法https://github.com/neo4j-labs/neosemantics/blob/4.0/src/test/java/n10s/validation/SHACLValidationProceduresTest.java#L59。我仍然收到上面列出的错误消息。我缺少什么?有没有人的 MWE 可以让 Neo4j 图形验证工作?
回答我自己的问题,neo4j命名空间已更改为
<neo4j://graph.schema#>
(https://github.com/neo4j-labs/neosemantics/issues/229)
我也遇到过类似的问题。在这里您有什么建议吗? https://community.neo4j.com/t/failed-to-import-shacl-with-neosemantics/64181