Сколько раз свойство применяется в SPARQL? - PullRequest
1 голос
/ 14 мая 2011

Если у меня есть запрос SPARQL, скажем,

PREFIX foaf <http://xmlns.com/foaf/0.1/>
SELECT ?name
WHERE {
  ?x foaf:name ?name.
  ?x foaf:knows ?y.
}

, чтобы выбрать имя некоторого x, который знает y.Как я могу выбрать только имена тех людей, которые точно знают 3 других людей (или любое другое число)?

Кроме того, в качестве дополнительного вопроса - есть ли лучшее название для этого вопроса?Тот, который использует лучшую терминологию для выяснения проблемы?

Спасибо

1 Ответ

3 голосов
/ 14 мая 2011

Этого можно добиться с помощью SPARQL 1.1 и его новых функций: GROUP BY, HAVING и SUBQUERIES.Примерно так будет работать:

SELECT ?name
WHERE {
    ?x foaf:name ?name .
    {
       SELECT ?x (count(?y) as ?count_y) WHERE {
              ?x foaf:knows ?y.
       } GROUP BY ?x 
         HAVING count(?y) > 3
    }
}

К сожалению, не все движки SPARQL поддерживают все эти функции вместе.Что я знаю Jena / ARQ и Virtuoso поддерживают их.

Если вы работаете с механизмом SPARQL, который не поддерживает эти функции, то я рекомендую запуститьquery:

SELECT ?name
WHERE {
  ?x foaf:name ?name.
  ?x foaf:knows ?y.
}

... и программно вычисляет остальную часть логики, которая вам нужна в запросе, с несколькими строками клиентского кода.

...