2014-03-28 4 views
1

짐이 알고있는 모든 사람들을 알고 그 다음에 체인과 같은 것을 아는 사람들을 찾기 위해 SPARQL 쿼리를 만들려고합니다. 다른 결과를 병합하는 Sparql

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, result2result3result4에 병합하는 것입니다.

result4: clare, antoine, jim, david, david, clare, clare, david, clare, clare, jim, david. 

을 한 후 중복을 제거하기 위해 DISTINCT을 사용 : 그래서 result4이 될 것입니다. 어떻게하면 좋을까요?

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 . 
    } 
} 

답변

4

은 이제 다음과 같이 예제가 표시됩니다 가정 해 봅시다 :

<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 술어의 전체 전이 폐쇄를 얻을 수 있습니다 : 당신의 triplestore 경우 ...

PREFIX foaf: <http://xmlns.com/foaf/0.1/> 

SELECT * WHERE { 
<http://example.com/person/1> foaf:knows+/rdfs:label ?knowsName . 
} 

SPARQL 1.1을 지원합니다. 그렇지 않으면 추론 또는 반복 쿼리를 사용하여 전체 종료를 가져야합니다.

+1

1000 명이 좋아요. 나는 구조가 다소 다르며 매력처럼 작동합니다. TYVM !!! – user3358377

관련 문제