2013-02-23 2 views
3

Virtuoso에 명명 된 그래프가 몇 개 있으며 제공 목록에서 가장 많은 수의 용어와 일치하는 그래프를 찾고 싶습니다.UNION이 많은 SPARQL 쿼리의 대안

내 쿼리는 다음과 같이 프로그래밍 방식으로 건설하고 보이는됩니다 :

SELECT DISTINCT ?graph (count(DISTINCT ?match) as ?matches) 
WHERE { 
    GRAPH ?graph { 
    {?match rdf:label "term 1"} 
    UNION {?match rdf:label "term 2"} 
    UNION {?match rdf:label "term 3"} 
    ... 
    } 
} 
ORDER BY DESC(?matches) 

각 용어는 다른 UNION 절됩니다.

더 좋은 방법이 있나요? 쿼리는 길고 못 생기고 Virtuoso는 너무 많은 용어가있을 때 불평합니다.

답변

3

(그것의 RDFS : 라벨)

를 작성하는 다른 방법은 다음과 같습니다

{ ?match rdfs:label ?X . FILTER (?x in ("term 1", "term 2", "term 3")) } 

또는 (SPARQL 1.0) SPARQL 1.1

{ ?match rdfs:label ?X . FILTER (?x = "term 1" || ?x = "term 2" || ?x = "term 3") } 
+0

훨씬 더 좋아 보이는군요. 감사합니다. –

+0

대안은 SPARQL 1.1의 새로운 VALUES를 사용하는 것입니다. 응답 할 때 이것이 가능한지 확실하지 않지만 답변을 업데이트 할 가치가 있습니다. –

2

하는 values 조항이있다 그 이것으로 도울 수 있습니다.

VALUES (?s ?p ?o) { (<http://abc#X> <http://abc#P1> UNDEF) 
        (UNDEF <http://abc#P2> <http://abc#Y>) } 

UNDEF 와일드 카드 기능과 세 쌍둥이의 반환 세트가 있습니다 : 그것은 UNDEF 다음과 같이 사용 (예)를 허용하는

select ?match where { 
    values ?label { "term 1" "term 2" "term 3" } 
    ?match rdfs:label ?label 
} 
1

값 솔루션은 더욱 강력하다 : 그것은 당신이 작성할 수 있습니다 각 값을 개별적으로 일치시키는 합집합입니다. 물론 대용량 데이터 세트의 경우 성능 측면에서 느려질 수 있습니다.

관련 문제