Comment faire correspondre les chaînes littérales exactes dans SPARQL?
-
25-09-2019 - |
Question
J'ai cette requête. Elle correspond à tout ce qui a « Sud » dans son nom. Mais je ne veux que celui dont foaf:name
est exactement « Sud ».
SELECT Distinct ?TypeLabel
WHERE
{
?a foaf:name "South" .
?a rdf:type ?Type .
?Type rdfs:label ?TypeLabel .
}
La solution
(Briser des commentaires pour cela)
Les problèmes de données
La question est les données, pas votre requête. Si utilisez la requête suivante:
SELECT DISTINCT ?a
WHERE {
?a foaf:name "Imran Khan" .
}
Vous trouvez (comme vous dites) "Imran Khan Niazy". Mais en regardant l'entrée de dbpedia Imran Khan , vous verrez à la fois:
foaf:name "Imran Khan Niazy"
foaf:name "Imran Khan"
Ceci est parce que RDF permet l'utilisation répétée des propriétés.
Cause
"Sud" a le même numéro (album, artiste, et curieusement 'Luton South'). Ce sont des cas où il y a deux noms familiers ( "Imran Khan", "Sud"), et les plus précis ( "Imran Khan Niazy", "South (album)") aux fins de correction ou homonymie.
Résolution
Si vous voulez essayer de correspondance plus précis en ajoutant un type (par exemple http://dbpedia.org/ontology/ MusicalWork pour l'album).
Beware
Sachez que DBpedia dérive de Wikipédia, et le processus d'extraction est pas parfait. Ceci est une zone vivant avec des données bancal, donc ne présumez pas votre requête ne va pas.
Autres conseils
un peu en retard, mais quand même ... Je pense que c'est ce que vous cherchez:
SELECT Distinct ?TypeLabel Where {
?a foaf:name ?name .
?a rdf:type ?Type .
?Type rdfs:label ?TypeLabel .
FILTER (?name="South"^^xsd:string)
}
vous pouvez utiliser le filtre avec les types xsd afin de limiter le résultat. J'espère que cela t'aides... cheers!
Cette requête doit correspondre exactement au South
littéral et non littéraux simplement contenant South
comme une sous-chaîne. Pour les matches partiels que vous iriez à FILTER
par exemple REGEX()
. Votre moteur de recherche est cassé dans ce sens - quel moteur requête que vous travaillez avec