2017-04-04 9 views
0

SPARQL에서 전이 쿼리의 결과가 걸러진 순서대로 되돌아 올 수 있도록 보장 할 수 있습니까?전 이적 SPARQL 질의로 정렬하기

<http://example.com/step0> ex:contains <http://example.com/step1> 
<http://example.com/step1> ex:contains <http://example.com/step2> 
<http://example.com/step2> ex:contains <http://example.com/step3> 

(실제로는 관계가 여러 번 반복 수)

쿼리 (SPARQL 1.1을 사용) :

SELECT ?parent 
WHERE { 
    ?parent ex:contains* <http://example.com/step3> 
} 

이러한 당신이 몇 가지 간단한 데이터 주어진 그래서

, 항상 [step0, step1, step2]로 되돌아갑니다. jena에서 이것을 시도 할 때 일관성이 있지만 무작위로 정렬 된 결과를 얻습니다. 또한

, 나는 외부를 재정렬 할 수 있도록 내가 이적 도보 다시 부모와 자식 모두를 얻을 수 있다면 괜찮을 것입니다,하지만 난 모두 ?parent ex:contains* <http://example.com/step3>을 결합하는 방법을 알고 다시하지 않는다 필터링을 사용하여 매우 느린 중첩 쿼리를 작성하지 않고 중간 관계의 객체.

+0

만 한 결과를 반환 않습니다 쿼리'HTTP :// example.com/step2' 따라서 Jena에서 작동한다고 말하는 이유를 이해할 수 없지만 결과는 무작위로 정렬됩니다. 'ex : contains *'와 같은 속성 경로가 사용되지 않으므로 여기에 과도기 개념을 이미 해결하고 있음을 알 수 없습니다. – AKSW

+0

죄송합니다. 질문에서 가장 중요한 단일 문자를 생략했습니다. ex : contains *, 질문을 업데이트했습니다. – Ben

답변

2

, 당신이 주문에 대한 조치로 홉의 수를 사용할 수 있습니다

PREFIX ex: <http://example.com/> 

SELECT ?start 
WHERE 
    { ?start (ex:contains)+ ?mid . 
    ?mid (ex:contains)* ex:step3 
    } 
GROUP BY ?start 
ORDER BY DESC(COUNT(?mid)) 

출력 :

------------ 
| start | 
============ 
| ex:step0 | 
| ex:step1 | 
| ex:step2 | 
------------ 
+0

일부 테스트를 마친 후 작동 중입니다. 감사합니다! 유일한 문제는 그래프의 크기에 따라 성능이 크게 저하된다는 것입니다 (선형으로 보입니다). 그러나 WHERE 절의 조건을 "{? mid (예 : 포함) * ex : step3.? start (예 : contains) +? mid}"로 바꾸면 순서는 여전히 올바르지 만 성능은 그렇지 않습니다. 더 이상 채워진 그래프로 떨어지십시오. 여전히 원래 쿼리보다 약 2 ~ 3 배 느리지 만 여러 쿼리를 수행하는 대신 허용됩니다. – Ben

0

이 데이터 예를 감안할 때, 시도 :

SELECT ?parent ?child ?subchid 
WHERE { 
    ?parent ex:contains <http://example.com/step3> . 
    ?child ex:contains ?parent . 
    OPTIONAL { ?subchild ex:contains ?child . } 
} 

모든 ex:contains 관계는 세 가지 수준 가면

, 당신은 OPTIONAL 패턴 일치를 수행해야 할 수 있습니다.

+0

답변을 주셔서 감사합니다. 실수로 쿼리를 전이시키는'예 : contains *'에 * 쓰지 않았습니다. 나는 그 질문을 갱신했다. 내 경우의 전이 관계의 깊이는 무제한 깊이로 간다. OPTIONAL이 어떻게 사용되는지 살펴볼 필요가 있습니다. 다른 답변에서 보았지만, Virtuoso의 특정 구문에 대한 인상을 얻었습니다. – Ben

+0

OP의 업데이트는 @ASKW의 응답을 참조하십시오. 'OPTIONAL'을 사용하는 예를 들어 위의 응답을 편집했습니다. – scotthenninger

1

SPARQL의 전 이적 쿼리 결과가 걸려온 순서대로 되돌아 올 수 있도록 보장 할 수 있습니까?

없음 고정 된 물체와 사실의 데이터가 직선 경로가 자연 산책 순서가 의미하는 일이다, 여기에

을합니다 (SPARQL 1.1 표준은 순서를 정의하지 않습니다).

Apache Jena SPARQL 실행은 결정적 (이 경우)이므로 결과의 내부 모음이 순서를 유지하기 때문에 어떤 순서로 실행됩니다. 모든 Jena 버전이이 작업을 수행하는 것은 아닙니다. 시간이 지남에 따라 변경되었습니다.

기타 비선형 경로의 경우 아무 것도 확실하지 않습니다. 데이터는 해시 맵을 사용하여 저장됩니다. 간단한 선형 경로에 대한

+0

전이 쿼리에 정렬 메커니즘이 있다면 명시 적으로 언급 한 항목을 찾는 데 어려움을 겪고있었습니다. 확인 된 것이 확인 된 것이 좋습니다. – Ben