2017-05-04 3 views
0

J'ai une collection de triplets RDF comme suit.Recherche de modèle sous-graphique en étoile dans SPARQL

id#7289587 ex:getInfectedBy id#7748320 
id#7694711 ex:getInfectedBy id#7748320 
id#7748322 ex:getInfectedBy id#7748320 
id#7748887 ex:getInfectedBy id#7748320 

id#7746679 ex:getInfectedBy id#7748510 
id#6434108 ex:getInfectedBy id#7748510 
id#7458397 ex:getInfectedBy id#7748510 

Mon objectif est de compter le diagramme sous-graphique en étoile des différentes longueurs de nœuds (4,5,6, ..., 20). Par exemple, j'ai écrit la requête suivante pour trouver un motif de sous-graphe en étoile de longueur de nœud 4 (? S1? S2? S3? O).

SELECT ?o count(distinct ?o) 
WHERE 
{ 
    ?s1 ?p ?o. 
    ?s2 ?p ?o. 
    ?s3 ?p ?o.FILTER((?s1!=?s2) && (?s1!=?s3) && (?s2!=?s3)) 
} group by ?o 

Le nombre de requête susmentionnée étoile longueur du motif de nœud 4 pour les deux noeuds id#7748320 et id#7748510. Cependant il suppose de me donner le résultat pour seulement le noeud id#7748510. Si je modifie la requête avec un motif d'étoile à 5 nœuds, le nœud id#7748320 apparaît également. Pourriez-vous s'il vous plaît m'aider à le réparer?

Est-il possible de compter un motif sous-graphique en étoile de longueur de nœud différente (4,5,6, ..., 20) avec une requête? S'il vous plaît, faites-moi savoir. J'apprécie ton aide.

+0

utiliser simplement 'SELECT * OÙ' avec votre requête pour voir pourquoi cela est correct dans SPARQL. Il est évident que les données du noeud 'id # 7748320' correspondent également au motif de la requête SPARQL, c'est juste que vous demandez quelque chose qui satisfait" au moins "cette exigence dans la requête. – AKSW

Répondre

1

En plus de mon commentaire, je voudrais simplement utiliser un autre et plus efficace requête qui « compte tous les noeuds entrants par nœud », puis le filtrer à l'aide HAVING:

SELECT ?o (COUNT(DISTINCT ?s) AS ?cnt) 
WHERE 
    { ?s ?p ?node } 
GROUP BY ?o 
HAVING (?cnt = 3) # three incoming nodes 
+0

Merci beaucoup pour votre réponse. Je pense que vous voulez dire 'noeud 'pas'? O'. J'ai exécuté la requête que vous avez fournie sur un point de terminaison SPARQL virtuose. Il me donne l'erreur suivante 'Virtuoso 37000 Erreur SP031: compilateur SPARQL: Variable? Cnt est utilisé dans le jeu de résultats hors agrégat et non mentionné dans la clause GROUP BY'. Veuillez me répondre. –

+1

Cela fonctionne si je modifie la clause 'HAVING' comme suit:' HAVING (COUNT (DISTINCT? S) = 3) '. Merci beaucoup pour votre aide. –

+0

Juste, j'ai oublié qu'il y a un problème avec Virtuoso pour certains cas où le résultat d'un agrégat est toujours dans la portée mais l'erreur est signalée de toute façon. – AKSW