SHACL SPARQLTarget未验证SPARQL查询输出节点



我有一个带有sh:SPARQLTarget的NodeShape。我尝试在本体编辑器中运行TargetSPARQL查询,它提供了结果,但当我在sh:select中的自定义目标节点形状中执行相同的查询时,它不会验证SPARQL查询返回的目标节点。我正在使用pySHACL。我做错什么了吗?我没主意了。这是我的Nodeshape和数据图:

我用"表示sh:select,而不是",因为我在python代码中将shapes_graph定义为变量,并且它已经编码在"中"quot"quot&";。我还在pyShacl中启用了meta_shacl=True,以确保我的shapes_graph是有效的。此外,当提供普通的TargetClass或TargetNode时,nodeShape(snomed:dob363698007Shape(也能很好地工作。我错过了什么?

我已经提到SPARQLRule没有构建

**NodeShape**
snomed: 
sh:declare [
sh:prefix "snomed" ;
sh:namespace <http://localhost:8890/snomed/> ; 
] .

snomed:dob363698007Shape
a sh:NodeShape ;
sh:target [
a sh:SPARQLTarget ;
sh:prefixes snomed: ;
sh:select "SELECT ?this WHERE { ?node a snomed:24078009.?node a snomed:dob .?node snomed:609096000 ?this.?this a  snomed:dob363698007 .bind(?node as ?conceptName).bind(?this as ?RGName) .FILTER(REGEX(strafter(xsd:string(?RGName),'snomed/'),strafter(xsd:string(?conceptName),'snomed/')) ).}";
] ;
sh:property [
sh:path snomed:363698007;
sh:minCount 1;
].```
**Data Graph**
```snomed:dob a rdfs:Class,snomed:dob ;
rdfs:label "Semantic Pattern dob"^^xsd:string ;
snomed:609096000 snomed:dob363698007 .
snomed:dob363698007 a rdfs:Class,snomed:dob363698007;
snomed:363698007 snomed:123037004 .  

snomed:24078009 a rdfs:Class, snomed:24078009, snomed:dob;
rdfs:label "Gangosa of yaws (disorder)"^^xsd:string ;
snomed:609096000 snomed:24078009_3,snomed:24078009_5,snomed:24078009_6;
rdfs:subClassOf snomed:128349005,
snomed:140004,
snomed:177010002,
snomed:312118003,
snomed:312129004,
snomed:312422001,
snomed:363166002,
snomed:47841006,
snomed:88037009 .
snomed:24078009_3 a rdfs:Class, snomed:24078009_3, snomed:dob363698007 ;
snomed:263502005 snomed:90734009 .
snomed:24078009_5 a rdfs:Class, snomed:24078009_5,snomed:dob363698007;
snomed:116676008 snomed:110435003 ;
snomed:246075003 snomed:6246005 ;
snomed:363698007 snomed:71836000 ;
snomed:370135005 snomed:441862004 .
snomed:24078009_6 a rdfs:Class, snomed:24078009_6,snomed:dob363698007 ;
snomed:116676008 snomed:110435003 ;
snomed:246075003 snomed:6246005 ;
snomed:363698007 snomed:72914001 ;
snomed:370135005 snomed:441862004 .

我已经将您的shacl形状文件和数据图放入PySHACL中,以隔离您看到的问题。

我发现你的设置有两个问题。

首先,基于SPARQL的目标是SHACL高级规范中的一个特性。PySHACL默认情况下不启用高级等级库功能。您可以启用";高级模式";通过将advanced=True传递给验证模块或在命令行工具上传递-a--advanced

这就是您的SPARQL目标没有选择您期望的节点的主要原因。

接下来,在启用高级模式后,您将看到PySHACL在加载SHACL形状图时失败。这是因为您的前缀命名空间没有正确声明。

请参阅Spec文档的SPARQL前缀部分中的示例。规范规定

"sh:namespace的值是数据类型xsd:anyURI的文字">

您的sh:namespace是URIRef,而不是Literal。将命名空间声明更改为以下内容可修复错误。

sh:namespace "http://localhost:8890/snomed/"^^xsd:anyURI ;

我已经运行了PySHACL和修正的形状图,它的工作方式和预期的一样。

有关完整的工作示例,请参阅以下代码:https://gist.github.com/ashleysommer/a319beeef33973906b76711675b2635c

最新更新