2013-02-23 1 views
3

У меня есть некоторые графические имена, хранящиеся в Virtuoso, и я хочу найти тот, который соответствует наибольшему числу терминов из предоставленного списка.Альтернативы запросу SPARQL с большим количеством UNION

Мой запрос строится программно и выглядит следующим образом:

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)

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

Это выглядит намного лучше, спасибо. –

+0

Альтернативой является использование новых значений VARUE SPARQL 1.1. Не уверен, что это было доступно при ответе, но может стоить обновление ответа. –

2

В SPARQL 1.1, есть пункт values, что может помочь с этим. Это позволяет написать:

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

Решение значения является еще более мощным, поскольку это позволяет использовать UNDEF следующим образом (например):

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

UNDEF имеет функцию подстановки и возвращаемый набор триплетов является объединением каждого триплетного значения по отдельности. Но, конечно, для больших наборов данных это может замедлить работу с точки зрения производительности.

 Смежные вопросы

  • Нет связанных вопросов^_^