[英]Sparql, how to merge different results
我試圖創建一個SPARQL查詢,以查找Jim認識的所有人員,然后查找Jim的認識者認識的人員,然后找到類似鏈的東西。
例如,我有:
Jim knows Clare and Antoine
Clare knows Jim and David
Antoine knows David and Clare
David knows Clare
因此結果如下:
result1: Clare, Antoine
result2: Jim, David, David, Clare
result3: Clare, David, Clare, Clare, Jim, David
我或多或少地做了類似樹的東西。
我想要的是將result1
, result2
和result3
合並到result4
。 因此, result4
將是:
result4: clare, antoine, jim, david, david, clare, clare, david, clare, clare, jim, david.
然后使用DISTINCT
刪除重復項。 請問我該如何實現?
SELECT ?Result1 ?Result2 ?Result3
WHERE{
{
base:Knows dc:Names _:BN1 .
_:BN1 dc:FName "Jim";
dc:KnownFName ?Result1 .
}
.
{
base:Knows dc:Names _:BN2 .
_:BN2 dc:FName ?Result1;
dc:KnownFName ?Result2 .
}
.
{
base:Knows dc:Names _:BN3 .
_:BN3 dc:FName ?Result2;
dc:KnownFName ?Result3 .
}
}
假設您的示例表示如下:
<http://example.com/person/1> <http://xmlns.com/foaf/0.1/knows> <http://example.com/person/2> .
<http://example.com/person/1> <http://xmlns.com/foaf/0.1/knows> <http://example.com/person/3> .
<http://example.com/person/2> <http://xmlns.com/foaf/0.1/knows> <http://example.com/person/1> .
<http://example.com/person/2> <http://xmlns.com/foaf/0.1/knows> <http://example.com/person/4> .
<http://example.com/person/3> <http://xmlns.com/foaf/0.1/knows> <http://example.com/person/4> .
<http://example.com/person/3> <http://xmlns.com/foaf/0.1/knows> <http://example.com/person/2> .
<http://example.com/person/4> <http://xmlns.com/foaf/0.1/knows> <http://example.com/person/2> .
<http://example.com/person/1> <http://www.w3.org/2000/01/rdf-schema#label> "Jim" .
<http://example.com/person/2> <http://www.w3.org/2000/01/rdf-schema#label> "Clare" .
<http://example.com/person/3> <http://www.w3.org/2000/01/rdf-schema#label> "Antoine" .
<http://example.com/person/4> <http://www.w3.org/2000/01/rdf-schema#label> "David" .
然后,您可以使用SPARQL的UNION功能,通過合並三個獨立查詢的結果來實現所需的功能。 可以使用SPARQL屬性路徑更簡潔地表示它:
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT DISTINCT * WHERE {
{ SELECT * WHERE {
<http://example.com/person/1> foaf:knows/rdfs:label ?knowsName .
} }
UNION
{ SELECT * WHERE {
<http://example.com/person/1> foaf:knows/foaf:knows/rdfs:label ?knowsName .
} }
UNION
{ SELECT * WHERE {
<http://example.com/person/1> foaf:knows/foaf:knows/foaf:knows/rdfs:label ?knowsName .
} }
}
您還可以通過單個屬性路徑表達式來獲得knows
謂詞的完全可傳遞閉包:
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT * WHERE {
<http://example.com/person/1> foaf:knows+/rdfs:label ?knowsName .
}
...如果您的Triplestore支持SPARQL 1.1。 否則,您將不得不使用推理或重復查詢來獲得完全關閉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.