2014-03-05 2 views
5

SPARQL에서 임의 길이의 경로 쿼리를 수행 할 수 있습니까? 예를 들어 패밀리 트리를 고려해 볼 때 PARENT_OF 관계 만 나타내는 그래프가있는 neo4j 스토어가 있다고 가정 해 보겠습니다. 사이퍼 쿼리는 사람의 모든 조상이 신 저장소가 RDF 기반의 트리플 저장소로 표현한다면이 쿼리는 SPARQL처럼 보일 것이다 어떻게SPARQL의 임의 경로 길이 쿼리

start n (some node from index query) match n<-[:PARENT_OF*]-k return k 

과 같을 것이다 얻을 수 있습니다. 이것도 가능합니다.

답변

9

이 같은 데이터가있는 경우 :

@prefix : <http://stackoverflow.com/q/22210295/1281433/> . 

:a :parentOf :b . 
:b :parentOf :c . 
:c :parentOf :d . 

는 다음과 같은 쿼리를 사용할 수 SPARQL 1.1의 property paths 사용하여이 같은 결과를 얻을 수

prefix : <http://stackoverflow.com/q/22210295/1281433/> 

select ?ancestor ?descendent where { 
    ?ancestor :parentOf+ ?descendent 
} 

을 :

------------------------- 
| ancestor | descendent | 
========================= 
| :a  | :b   | 
| :a  | :c   | 
| :a  | :d   | 
| :b  | :c   | 
| :b  | :d   | 
| :c  | :d   | 
------------------------- 

*이 0의 인 관계를 허용하고 각 노드를 자체와 연관시킵니다. 각 항목을 그 자체의 조상으로 만들고 싶다면 +*으로 바꿀 수 있습니다.

+1

답변 해 주셔서 감사합니다. 이 연산의 계산 비용은 얼마입니까? 트리플 스토어 구현에 따라 달라질 것입니다. 알레그로 그래프 db와 같은 인기있는 구현은 neo4j 또는 titan과 비교되는 성능입니다. – Amit

+1

SPARQL은 특정 실행 모델을 정의하지 않으므로 계산 상 비싼 방법을 말하는 것이 쉽지 않습니다. 실제로 구현에 달려 있습니다. 특정 구현에 대한 성능에 관심이 있다면, 직접 테스트해야하거나, 누군가를 비교하여 결과를 게시했는지 확인해야합니다. –