étant donné un ID IMDb, je veux obtenir une liste des réalisateurs et des acteurs pour ce film de Wikidata. Le problème est, je veux UNION à la fois le directeur et l'acteur requête dans une seule colonne tout en fournissant une nouvelle colonne avec le rôle de directeur ou d'acteur.SPARQL BIND dans UNION est trop lent
assez facile requête globale: d'abord je reçois l'entité de film de l'ID IMDb, puis je reçois tous les réalisateurs de ce film suivi par obtenir tous les acteurs de ce film et les assembler en remplissant une nouvelle colonne (? Rôle) avec le rôle.
ce que j'ai:
PREFIX p: <http://www.wikidata.org/prop/>
PREFIX ps: <http://www.wikidata.org/prop/statement/>
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
SELECT ?person ?personLabel ?role ?imdb WHERE
{
?movie wdt:P345 "tt0110912" .
{ ?movie p:P57 ?cast .
?cast ps:P57 ?person .
BIND("director" as ?role) .
} UNION {
?movie p:P161 ?cast .
?cast ps:P161 ?person .
BIND("actor" as ?role) . }
?person wdt:P345 ?imdb .
OPTIONAL { ?cast prov:wasDerivedFrom ?ref . }
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
GROUP BY ?person ?personLabel ?role ?imdb
ORDER BY DESC(?role)
LIMIT 100
cela fonctionne et donne le résultat que je veux, problème, il faut environ 10secs. si je supprime les BINDs sa vitesse instantanée, mais je ne reçois pas une colonne avec les rôles.
Y at-il quelque chose qui me manque? merci d'avance.
Vous n'avez même pas besoin de l'union ici. Utilisez juste 'values (? P? Role) {(p: P57" directeur ") (p: P161" acteur ")}', etc. –
A droite, c'est beaucoup plus élégant. Si je comprends bien, vous vouliez remplacer toute la partie UNION par 'values (? P? Role) {(p: P57" directeur ") (p: P161" acteur ")} ? Movie? P? Cast. droite? Malheureusement, cela conduit à un délai d'attente (au moins au moment de l'écriture). Je suppose que c'est similaire au problème de performance avec BIND. Je ne sais pas comment Blazegraph est optimisé plus, à première vue cela ressemble à une simple requête. – AKSW
AKSW, je me suis trompé dans ce que j'ai écrit. OP utilise deux propriétés dans chacun des côtés d'union (par exemple, p: P171 et ps: P161). Ce devrait être 'values (? P? Ps? Rôle) ...'. J'ai ajouté [une réponse] (http://stackoverflow.com/a/43392591/1281433). Les résultats sont presque instantanés. –