Этого можно добиться с помощью 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.
}
... и программно вычисляет остальную часть логики, которая вам нужна в запросе, с несколькими строками клиентского кода.