[英]SHACL SPARQLTarget not validating the SPARQL query output nodes
我有一個帶有 sh:SPARQLTarget 的 NodeShape。 我嘗試在本體編輯器中運行 Target SPARQL 查詢並提供了結果,但是當我在 sh:select 中的自定義目標節點形狀中執行相同的查詢時,它不會驗證 SPARQL 查詢返回的目標節點. 我正在使用 pySHACL。 我做錯什么了嗎? 我沒主意了。 這是我的節點形狀和數據圖:
我在 sh:select 中使用了“”而不是“””“”,因為我在 python 代碼中將 shapes_graph 定義為變量,並且它已經編碼為“””“””。 我還在 pyShacl 中啟用了 meta_shacl=True 以確保我的 shapes_graph 有效。 此外,nodeShape (snomed:dob363698007Shape) 在提供普通 TargetClass 或 TargetNode 時也能正常工作。 我錯過了什么?
我已經提到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-Based Targets是SHACL Advanced Specification的一個特性。 PySHACL 默認不啟用 Advanced-Spec 功能。 您可以通過將advanced=True
傳遞給驗證模塊或在命令行工具上傳遞-a
或--advanced
來啟用“高級模式”。
這是您的 SPARQL 目標未選擇您期望的節點的主要原因。
接下來,啟用高級模式后,您將看到 PySHACL 在加載 SHACL Shape Graph 時失敗。 那是因為你的前綴命名空間沒有正確聲明。
請參閱規范文檔的 SPARQL 前綴部分中的示例。 規范規定
“sh:namespace 的值是數據類型 xsd:anyURI 的文字。”
您的sh:namespace
是 URIRef,而不是文字。 將命名空間聲明更改為以下內容,修復了錯誤。
sh:namespace "http://localhost:8890/snomed/"^^xsd:anyURI ;
我已經使用更正后的形狀圖運行 PySHACL,它按預期工作。
有關完整的工作示例,請參閱此代碼: https://gist.github.com/ashleysommer/a319beeef33973906b76711675b2635c
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.