SPARQL en utilisant une sous-requête avec limite
Je développe une application java qui utilise ARQ pour exécuter des requêtes SPARQL à l'aide d'un Fuseki extrémité TDB.
Des besoins de l'application d'une requête qui retourne le lieu de naissance de chaque personne et une autre personne qui est né dans le même endroit.
Pour commencer, j'ai écrit cette requête SPARQL qui renvoie person_ids et le lieu de naissance de chaque personne.
prefix fb: <http://rdf.freebase.com/ns/>
prefix fn: <http://www.w3.org/2005/xpath-functions#>
select ?person_id ?place_of_birth
where {
?person_id fb:type.object.type fb:people.person .
?person_id fb:people.person.place_of_birth ?place_of_birth_id .
?place_of_birth_id fb:type.object.name ?place_of_birth .
FILTER (langMatches(lang(?place_of_birth),"en"))
}
LIMIT 10
----------------------------------
| person_id | place_of_birth |
==================================
| fb:m.01vtj38 | "El Centro"@en |
| fb:m.01vsy7t | "Brixton"@en |
| fb:m.09prqv | "Pittsburgh"@en |
----------------------------------
Après cela, j'ai ajouté une sous-requête (https://jena.apache.org/documentation/query/sub-select.html) l'ajout d'une autre personne qui y est né, mais je reçois plus d'une personne qui lui est liée et j'ai seulement besoin d'une.
prefix fb: <http://rdf.freebase.com/ns/>
prefix fn: <http://www.w3.org/2005/xpath-functions#>
select ?person_id ?place_of_birth ?other_person_id
where {
?person_id fb:type.object.type fb:people.person .
?person_id fb:people.person.place_of_birth ?place_of_birth_id .
?place_of_birth_id fb:type.object.name ?place_of_birth .
{
select ?other_person_id
where {
?place_of_birth_id fb:location.location.people_born_here ?other_person_id .
}
}
FILTER (langMatches(lang(?place_of_birth),"en"))
}
LIMIT 10
---------------------------------------------------
| person_id | place_of_birth | other_person_id |
===================================================
| fb:m.01vtj38 | "El Centro"@en | fb:m.01vtj38 |
| fb:m.01vtj38 | "El Centro"@en | fb:m.01vsy7t |
| fb:m.01vtj38 | "El Centro"@en | fb:m.09prqv |
---------------------------------------------------
J'ai essayé d'ajouter une LIMITE de 1 sous-requête, mais il semble que cela ne fonctionne pas ( la requête est exécutée, mais ne se termine jamais )
prefix fb: <http://rdf.freebase.com/ns/>
prefix fn: <http://www.w3.org/2005/xpath-functions#>
select ?person_id ?place_of_birth ?other_person_id
where {
?person_id fb:type.object.type fb:people.person .
?person_id fb:people.person.place_of_birth ?place_of_birth_id .
?place_of_birth_id fb:type.object.name ?place_of_birth .
{
select ?other_person_id
where {
?place_of_birth_id fb:location.location.people_born_here ?other_person_id .
}
LIMIT 1
}
FILTER (langMatches(lang(?place_of_birth),"en"))
}
LIMIT 3
Est-il un moyen de retourner qu'un seul résultat dans la sous-requête, ou puis-je pas le faire à l'aide de SPARQL.
Pour la n-par question, je pense que cette question peut être un doublon de les requêtes Imbriquées dans sparql avec des limites, mais malheureusement qui n'a pas de réponse.
OriginalL'auteur Diego | 2014-11-21
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser des limites avec les sous-requêtes
Vous pouvez utiliser des limites dans les sous-requêtes. Voici un exemple:
Comme vous pouvez le voir, vous obtenez deux valeurs de la sous-requête (5 et 6), et ceux-ci sont combinés avec les fixations de la requête externe, à partir de laquelle nous obtenons cinq lignes au total (en raison de la limite).
Les sous-requêtes sont évaluées les plus intimes de la première
Cependant, gardez à l'esprit que les sous-requêtes sont évaluées à partir de l'intime tout d'abord, pour l'extérieur. Cela signifie que dans votre requête,
vous êtes de trouver un match pour
et en passant le ?other_person_id liaison hors dans la requête externe. Le reste de la requête externe n'utilise pas ?other_person_id, bien que, de sorte qu'il n'a pas vraiment d'effet sur les résultats.
Quoi faire à la place
Si vous avez besoin d'une seule autre personne
Sur le plan conceptuel, on peut le voir à ce que la cueillette à une personne, à trouver leur lieu de naissance, et échantillonnage une personne de plus de gens nés dans ce lieu. Vous pouvez réellement écrire la requête comme ça, aussi:
Si vous avez besoin de plus d'un
C'est beaucoup plus délicat problème si vous avez besoin de plus qu'une "autre raison" pour chaque résultat. C'est le problème dans Requêtes imbriquées dans sparql avec des limites. Il y a une approche en Comment limiter SPARQL solution de la taille du groupe? qui peuvent être utilisés pour cela.
Tu veux dire quoi par "requête"? Quelle est la prochaine étape de la requête? Et à la question d'origine n'ont pas de poser sur le retour de trois autres pour chaque personne, il a demandé à retourner. Ceux qui ne sont pas le même problème.
OriginalL'auteur Joshua Taylor