2011-05-13 5 views
1

Si j'ai une requête SPARQL direCombien de fois une propriété est-elle appliquée dans SPARQL?

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

pour sélectionner le nom de certains x, qui connaît un peu y. Comment pourrais-je sélectionner uniquement les noms de ces personnes qui connaissent exactement 3 autres personnes (ou tout autre numéro)?

Aussi, en tant que question secondaire - y a-t-il un meilleur titre pour cette question? Un qui utilise une meilleure terminologie pour clarifier le problème?

Merci

+1

Oui, le titre peut être un peu confus. Mais si vous ne connaissiez pas l'existence d'agrégats, je pense que ce n'est pas si grave. En fin de compte, l'importation est le contenu de la question qui est bon dans ce cas. –

+0

@msalvadores Merci. Je ne savais pas ce terme appliqué à SPARQL ainsi que SQL, non .. – Adam

Répondre

3

Vous pourriez y parvenir avec SPARQL 1.1 et de nouvelles fonctionnalités: GROUP BY, HAVING et les sous-requêtes. Quelque chose comme ça ferait l'affaire:

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 
    } 
} 

Malheureusement, tous les moteurs SPARQL ne prennent pas en charge toutes ces fonctionnalités ensemble. Que je connais Jena/ARQ et Virtuoso les soutenir.

Si vous travaillez avec un moteur SPARQL qui ne prend pas en charge ces fonctions, je vous recommande d'exécuter la requête:

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

... et calculer le reste programatically de la logique que vous avez besoin dans la requête avec quelques lignes de code côté client.

+0

Donc, ayant SPARQL 1.1. Cela dépend-il du point de terminaison, de ma bibliothèque Jena/ARQ ou des deux? – Adam

+0

Aussi, vraisemblablement ce serait ==, pas> – Adam

+1

@Aidan Oui pour exactement 3 amis le changer en '=' (note unique est égal à SPARQL égalité). La prise en charge de SPARQL 1.1 dépend du point de terminaison, que vous ayez besoin d'une bibliothèque qui le prend en charge dépend si la bibliothèque analysera/validera la requête avant de l'envoyer à un point de terminaison. Si la bibliothèque ne le fait pas, seul le point de terminaison doit prendre en charge SPARQL 1.1 car le format de résultats utilisé pour encoder les résultats par le point de terminaison est exactement le même et peut être interprété par une bibliothèque non avertie de SPARQL 1.1 – RobV

Questions connexes