2010-05-04 7 views
1

J'ai deux requêtes:SPARQL UNION - jeu de résultats incomplets

requête 1:

SELECT DISTINCT ?o COUNT(?o) 
WHERE 
{ ?s1 ?somep1 <predicate_one-uri>. ?s1 ?p ?o} 

requête 2:

SELECT DISTINCT ?o COUNT(?o) 
WHERE 
{?s2 ?somep2 <predicate_two-uri>.?s2 ?p ?o.} 

Chaque requête me donne un autre jeu de résultat (comme prévu) . Je dois faire une union de ces deux ensembles, d'après ce que je comprends la question ci-dessous devrait me donner l'ensemble je veux:

SELECT DISTINCT ?o COUNT(?o) 
WHERE 
{ 
{ ?s1 ?somep1 <predicate_one-uri>.?s1 ?p1 ?o} 
    UNION 
{?s2 ?somep2 <predicate_two-uri>.?s2 ?p2 ?o.} 
} 

Le problème est que certains résultats de recherche 1 ne sont pas dans l'ensemble des syndicats et vice -versa pour la requête 2. L'union ne fonctionne pas correctement car elle n'incorpore pas tous les résultats de la requête 1 et de la requête 2. Veuillez indiquer la structure appropriée de la requête sparql pour obtenir l'ensemble de résultats souhaité.

Bien que si je fais la requête suivante (il suffit de supprimer la fonction COUNT):

SELECT DISTINCT ?o 
WHERE 
{ 
{ ?s1 ?somep1 <predicate_one-uri>.?s1 ?p ?o} 
UNION {?s2 ?somep2 <predicate_two-uri>.?s2 ?p ?o.} 
} 

je reçois le jeu de résultats appropriés. Mais j'ai aussi besoin d'avoir la fréquence de la variable ?o.

Répondre

1

Pas tout à fait sûr ici, mais une théorie qui peut être tout à fait tort

Votre requête me embrouille un peu comme cela semble impliquer un certain groupe depuis au moins en théorie un moteur SPARQL ne doit pas vous permettre de sélectionner à la fois une variable et un agrégat sur cette variable dans la même requête sans GROUP BY explicite. Les résultats peuvent donc dépendre de quel moteur/triplestore SPARQL vous utilisez?

Si un regroupement implicite est le cas, vous risquez de ne pas obtenir autant de résultats que vous le souhaitez car le regroupement regroupera les résultats des deux côtés de l'union. Par exemple, si la requête 1 vous donne 10 résultats et la requête 2 vous donne 5 résultats, le nombre maximum de résultats que vous pouvez obtenir d'une union est de 15 mais peut être inférieur car le regroupement peut combiner les résultats des deux côtés de l'union. Pour éviter cela, vous devez utiliser des noms de variables complètement différentes des deux côtés de la requête, par exemple:

SELECT * WHERE { {?s ?p ?o} UNION {?x ?y ?z}} 

qui vous donnerait un tableau des résultats qui avait un modèle comme les suivantes:

?s | ?p | ?o | ?x | ?y | ?z 
----------------------------- 
    a | b | c | | | 
    | | | a | b | c 

Je ne sais pas si cela est pertinent/utile pour vous, si vous pouvez fournir plus de détails sur l'environnement dans lequel vous exécutez la requête, par exemple Triplestore, moteur SPARQL, API/bibliothèque, etc alors je/quelqu'un d'autre peut être en mesure de fournir une meilleure répondre

+0

Merci pour vos commentaires. J'utilise OpenVirtuoso qui, je crois, utilise Jena, ce qui me permet d'utiliser la fonction d'agrégation COUNT. J'ai obtenu une référence ici: http://stackoverflow.com/questions/1223472/sparql-query-and-distinct-count. Je comprends que la quantité de lignes retournées par une union pourrait être inférieure à la somme des deux requêtes à cause de l'union. Mon problème est que certaines valeurs n'apparaissent même pas dans la requête union qui étaient présentes dans la requête 1 par exemple. Désolé, je suis encore nouveau sur SPARQL et RDF, je crois que le triple magasin est en RDF/XML (est-ce logique?). Merci encore JPL – levacjeep

2

Je pense que cela fonctionnera si vous supprimez le DISTINCT et ajoutez GROUP BY ?o à la fin de la requête.

DISTINCT est vraiment juste pour éliminer les doublons. Ce n'est pas pour le regroupement et le comptage.