我需要使用一個SPARQL查詢檢索與特定謂詞標識的主題關聯的所有「屬性」。我特別避免使用術語「導出三元組」,因爲我不一定需要CONSTRUCT
(可以是CONSTRUCT
或SELCET
可以)。使用SPARQL檢索具有子節點的RDF資源
某些「屬性」本身就是節點(可能是空白節點),需要「遞歸」檢索。謂詞的集合是已知的(我有一個全面的列表,他們都在相同的前綴,他們都是那些前綴)。 「遞歸」的謂詞是它們的一個子集。
@prefix ex: <http://example.org/ex/> .
@prefix : <http://example.org/> .
ex:toExport
a ex:SomeClass ; # to retrieve, as in rdf: namespace
:pred-1 "Some value" ; # to retrieve "as is"
:pred-2 42 ; # to retrieve "as is"
:pred-3 [ # blank-node to be retrieved as a whole
:pred-1 "..." ;
:pred-2 1024
] ;
:pred-4 [
:pred-3 [ # "sub" blank-node to be retrieved as a whole
:pred-1 "..." ;
:pred-2 1024
]
] ;
:pred-5 [ # same for a "sub-list"
:pred-6 (ex:something ex:else)
] ;
:pred-7 ex:subOne . # "sub-property" can be a non-blank node...
ex:subOne # ...defined as a resource of its own
:pred-1 "Value" ;
:pred-2 0 .
在上面的例子,我需要與謂詞:pred-1
和:pred-2
(簡單的值),:pred-3
(它的值是在這些實施例2點的三元組一個空節點),:pred-4
檢索三元組(一空白節點本身以及一個額外的空白節點)等等。:pred-7
很有趣,因爲它顯示所有「子節點」不一定是空白節點。
下面的查詢是我找到符合我的要求最接近的,但它使用虹膜,這是我想避免的查詢對大型數據集的字符串值正則表達式:
CONSTRUCT {
?s ?p ?o .
?o ?pp ?oo .
?oo ?ppp ?ooo .
}
WHERE {
{
?s ?p ?o .
FILTER (regex(str(?p), "^(http://www.w3.org/ns/shacl#|http://www.w3.org/1999/02/22-rdf-syntax-ns#)"))
OPTIONAL
{
?o ?pp ?oo .
FILTER (regex(str(?pp), "^(http://www.w3.org/ns/shacl#|http://www.w3.org/1999/02/22-rdf-syntax-ns#)"))
OPTIONAL
{
?oo ?ppp ?ooo .
FILTER (regex(str(?ppp), "^(http://www.w3.org/ns/shacl#|http://www.w3.org/1999/02/22-rdf-syntax-ns#)"))
}
}
}
的謂詞集合就像20個不同的謂詞,因此可以很容易地將它們列出來,但如果它是以組合方式進行排列的話,它是可以管理的。
我沒有看到很多優化它的潛力,但您至少可以在單獨的子SELECT查詢中首先查詢不同的屬性,以便它只執行一次。查詢的其餘部分與預期一樣,生成深度爲3的子圖 – AKSW