2017-04-04 2 views
0

Est-il possible de garantir que les résultats d'une requête transitive dans SPARQL reviennent dans l'ordre dans lequel ils ont été parcourus?Commande dans une requête SPARQL transitive

Ainsi, compte tenu de certaines données simples:

<http://example.com/step0> ex:contains <http://example.com/step1> 
<http://example.com/step1> ex:contains <http://example.com/step2> 
<http://example.com/step2> ex:contains <http://example.com/step3> 

(en pratique, la relation pourrait répéter de nombreuses fois)

requête (en utilisant SPARQL 1.1):

SELECT ?parent 
WHERE { 
    ?parent ex:contains* <http://example.com/step3> 
} 

tel que vous reviendrait toujours [step0, step1, step2]. En essayant cela à Jena, je reçois des résultats cohérents mais ordonnés au hasard.

Sinon, ce serait bien si je pouvais revenir le parent et l'enfant à la marche transitif afin que je puisse réordonner à l'extérieur, mais je ne sais pas comment les deux se lient ?parent ex:contains* <http://example.com/step3> et revenir les objets des relations intermédiaires sans écrire une requête imbriquée très lente avec filtrage.

+0

Votre requête ne renvoie qu'un seul résultat qui est 'http:// example.com/step2', donc, je ne comprends pas pourquoi vous dites que ça marche à Iéna mais les résultats sont triés au hasard. Je ne peux pas voir que vous êtes déjà en train de résoudre le concept de transitivité ici car aucun chemin de propriété comme 'ex: contains *' n'est utilisé – AKSW

+0

Désolé, j'ai omis le caractère le plus important de la question. Il était supposé être ex: contient *, j'ai mis à jour la question – Ben

Répondre

2

Pour de simples chemins linéaires, vous pouvez utiliser le nombre de sauts comme mesure pour la commande:

PREFIX ex: <http://example.com/> 

SELECT ?start 
WHERE 
    { ?start (ex:contains)+ ?mid . 
    ?mid (ex:contains)* ex:step3 
    } 
GROUP BY ?start 
ORDER BY DESC(COUNT(?mid)) 

Sortie:

------------ 
| start | 
============ 
| ex:step0 | 
| ex:step1 | 
| ex:step2 | 
------------ 
+0

Après quelques tests, il semble que cela fonctionne, merci! Le seul problème est que la performance se dégrade assez significativement avec la taille du graphique (semble être linéaire). Cependant, si j'inverse les conditions dans la clause WHERE à "{? Mid (ex: contient) * ex: step3.? Start (ex: contient) +" mid} "la commande est toujours correcte mais la performance ne semble pas déposer avec un graphique peuplé plus. Il est encore environ 2-3 fois plus lent que la requête d'origine, mais cela est acceptable par rapport à devoir effectuer plusieurs requêtes. – Ben

0

Étant donné vos données par exemple, essayez:

SELECT ?parent ?child ?subchid 
WHERE { 
    ?parent ex:contains <http://example.com/step3> . 
    ?child ex:contains ?parent . 
    OPTIONAL { ?subchild ex:contains ?child . } 
} 

Si toutes les relations ex:contains vont trois niveaux, vous devrez peut-être faire une correspondance de motif OPTIONAL.

+0

Merci pour votre réponse, j'ai accidentellement laissé de côté le * sur 'ex: contient *' qui rend la requête transitive. J'ai mis à jour la question. La profondeur de la relation transitive dans mon cas va à une profondeur illimitée. Je vais devoir voir comment OPTIONAL est utilisé, je l'avais vu dans d'autres réponses mais j'avais eu l'impression qu'il s'agissait d'une syntaxe spécifique à Virtuoso. – Ben

+0

Pour la mise à jour dans votre OP, voir la réponse de @ASKW. Pour un exemple d'utilisation de 'OPTIONAL', j'ai édité la réponse ci-dessus. – scotthenninger

1

Est-il possible de garantir que viennent les résultats d'une requête transitif dans SPARQL dans l'ordre dans lequel ils ont été parcourus?

Non (la norme SPARQL 1.1 ne définit pas l'ordre)

Ici, l'objet fixe et le fait que les données sont un chemin linéaire arrive à dire il y a un ordre de marche naturel. Comme l'exécution d'Apache Jena SPARQL est déterministe (dans ce cas), elle ne sortira dans un certain ordre que parce que la collection interne de résultats retiendra l'ordre. Toutes les versions d'Iéna ne le font pas: elles ont changé au fil du temps.

Pour d'autres chemins non linéaires, rien n'est certain. Les données sont stockées à l'aide de cartes de hachage.

+0

Merci, j'avais de la difficulté à trouver quelque chose qui mentionnait explicitement si l'interrogation transitive avait un mécanisme de commande, donc il est bon de le confirmer. – Ben