SHACL SPARQLTarget 未验证 SPARQL 查询输出节点
SHACL SPARQLTarget not validating the SPARQL query output nodes
我有一个带有 sh:SPARQLTarget 的 NodeShape。我尝试在 ontology 编辑器中 运行 Target SPARQL 查询并提供了结果,但是当我在 sh:select 中的自定义目标节点形状中执行相同的查询时,它不会t 验证 SPARQL 查询返回的目标节点。我正在使用 pySHACL。我做错什么了吗?我没主意了。这是我的节点形状和数据图:
我在 sh:select 中使用了“”而不是“”“”,因为我在我的 python 代码中将 shapes_graph 定义为变量并且它已经编码为“”“”“”。我还在 pyShacl 中启用了 meta_shacl=True 以确保我的 shapes_graph 有效。此外,nodeShape (snomed:dob363698007Shape) 在提供普通 TargetClass 或 TargetNode 时也能正常工作。我错过了什么?
我已经提到了
**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-Based Targets is a feature from the SHACL Advanced Specification。 PySHACL 默认不启用 Advanced-Spec 功能。您可以通过将 advanced=True
传递给验证模块或在命令行工具上传递 -a
或 --advanced
来启用“高级模式”。
这是您的 SPARQL 目标未选择您期望的节点的主要原因。
接下来,启用高级模式后,您将看到 PySHACL 在加载 SHACL Shape Graph 时失败。那是因为你的前缀命名空间没有正确声明。
参见 SPARQL-Prefixes section of the Spec document 中的示例。规范规定
"The values of sh:namespace are literals of datatype xsd:anyURI."
您的 sh:namespace
是一个 URIRef,而不是文字。将命名空间声明更改为以下内容,修复了错误。
sh:namespace "http://localhost:8890/snomed/"^^xsd:anyURI ;
我已经 运行 PySHACL 修正了形状图,它按预期工作。
有关完整的工作示例,请参阅此代码:https://gist.github.com/ashleysommer/a319beeef33973906b76711675b2635c
我有一个带有 sh:SPARQLTarget 的 NodeShape。我尝试在 ontology 编辑器中 运行 Target SPARQL 查询并提供了结果,但是当我在 sh:select 中的自定义目标节点形状中执行相同的查询时,它不会t 验证 SPARQL 查询返回的目标节点。我正在使用 pySHACL。我做错什么了吗?我没主意了。这是我的节点形状和数据图:
我在 sh:select 中使用了“”而不是“”“”,因为我在我的 python 代码中将 shapes_graph 定义为变量并且它已经编码为“”“”“”。我还在 pyShacl 中启用了 meta_shacl=True 以确保我的 shapes_graph 有效。此外,nodeShape (snomed:dob363698007Shape) 在提供普通 TargetClass 或 TargetNode 时也能正常工作。我错过了什么?
我已经提到了
**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-Based Targets is a feature from the SHACL Advanced Specification。 PySHACL 默认不启用 Advanced-Spec 功能。您可以通过将 advanced=True
传递给验证模块或在命令行工具上传递 -a
或 --advanced
来启用“高级模式”。
这是您的 SPARQL 目标未选择您期望的节点的主要原因。
接下来,启用高级模式后,您将看到 PySHACL 在加载 SHACL Shape Graph 时失败。那是因为你的前缀命名空间没有正确声明。
参见 SPARQL-Prefixes section of the Spec document 中的示例。规范规定
"The values of sh:namespace are literals of datatype xsd:anyURI."
您的 sh:namespace
是一个 URIRef,而不是文字。将命名空间声明更改为以下内容,修复了错误。
sh:namespace "http://localhost:8890/snomed/"^^xsd:anyURI ;
我已经 运行 PySHACL 修正了形状图,它按预期工作。
有关完整的工作示例,请参阅此代码:https://gist.github.com/ashleysommer/a319beeef33973906b76711675b2635c