2016-06-20 4 views
5

컨텐츠 DB에 저장하고있는 개별 문서의 일부로 관리되지 않는 트리플을 저장했습니다. 본질적으로 각 문서는 사람을 나타내며 정의 된 트리플은 사람의 관리자에 대한 문서 URI를 지정합니다. SPARQL을 사용하여 관리자와 그 아래에있는 모든 계층 간의 경로 길이를 확인하려고합니다. 문서의SPARQL 쿼리를 최적화 할 수있는 방법이 있습니까?

트리플 내가 계층 구조에서 그 아래에 다음과 같은 SPARQL 관리자를 반환하는 데 사용할 수있는 쿼리, aperson을 발견

<sem:triple xmlns:sem="http://marklogic.com/semantics"> 
    <sem:subject>http://rdf.abbvienet.com/infrastructure/person/10740024</sem:subject> 
    <sem:predicate>http://schemas.abbvienet.com/ontologies/infrastructure.owl#manager</sem:predicate> 
    <sem:object>http://rdf.abbvienet.com/infrastructure/person/10206242</sem:object> 
</sem:triple> 

처럼, 그리고 노드의 수는 먼 그들이있다 .

select ?manager ?leaf (count(?mid) as ?distance) { 
    BIND(<http://rdf.abbvienet.com/infrastructure/person/10025613> as ?manager) 
    ?leaf <http://schemas.abbvienet.com/ontologies/infrastructure.owl#manager>* ?mid . 
    ?mid <http://schemas.abbvienet.com/ontologies/infrastructure.owl#manager>+ ?manager . 
} 
group by ?manager ?leaf 
order by ?manager ?leaf 

15 초 주위에, 심지어 내가보고하고있는 계층 구조 트리가 하나 개 또는 두 가지 수준의 깊은 경우, 작동하지만 매우 느립니다. 이 유형의 관리자 트리플은 63,139입니다.

+0

'? manager'에 대해 단 하나의 바인딩 만 있어도 'ORDER BY? leaf'가 아니어야합니다. – scotthenninger

답변

6

가장 큰 문제는 BIND()입니다. MarkLogic 8은 사용중인 패턴을 최적화하지 않습니다. 변수가 큰 차이를 만드는 지 확인하기 위해 변수를 ?manager으로 사용하는 장소에 상수를 대입 해 볼 수 있습니까? 정말 우리는 당신을 돕기 위해 협력 대화를 필요로 즉 :

select ?leaf (count(?mid) as ?distance) { 
    ?leaf <http://schemas.abbvienet.com/ontologies/infrastructure.owl#manager>* ?mid . 
    ?mid <http://schemas.abbvienet.com/ontologies/infrastructure.owl#manager>+ 
    <http://rdf.abbvienet.com/infrastructure/person/10025613> . 
} 
group by ?leaf 
order by ?leaf 

StackOverflow의이 같은 성능 질문에 대답 할 수있는 좋은 장소가 아니다. 아마도 이런 종류의 질문에 support 또는 MarkLogic developer mailing list에 문의 해 볼 수 있습니다.

+0

바인드가 없으면 매우 빠르게 실행됩니다. 감사. –

+0

또 다른 의견입니다. 또한'sem : sparql' 호출에서 바인드 매개 변수를 설정하면 빠릅니다. SPARQL에서 직접 바인드 할 때만 느립니다. –

관련 문제