IMDb ID가 주어지면 Wikidata에서 해당 영화의 감독과 배우 목록을 가져오고 싶습니다.UNION 내의 SPARQL BIND가 너무 느림
문제는 디렉터와 액터 쿼리를 모두 단일 열로 UNION하고 디렉터 나 액터의 역할을 새 열에 제공하고 싶습니다.
전체적으로 간단한 쿼리 : 먼저 IMDb ID에서 영화 엔티티를 얻은 다음 해당 영화의 모든 감독을 얻은 다음 해당 영화의 모든 배우를 가져 와서 함께 결합하여 새 열 (? 역할) 역할을합니다.
이 작동하고 내가 원하는 결과를 제공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
, 문제는 그것이 10secs 정도 걸립니다입니다 :
이 내가 가지고있는 것입니다. 내가 BIND를 즉시 속도로 제거하지만 역할이있는 열을 얻지 못한다면
거기에 뭔가가 있습니까? 사전에 감사합니다.
여기에도 노조가 필요하지 않습니다. 'values (? p? role) {(p : P57 "director") (p : P161 "actor")}'등을 사용하십시오. –
오른쪽은 훨씬 우아합니다. 만약 내가 정말로 이해한다면, 전체 UNION 부분을 값 (? p? role) {(p : P57 "director") (p : P161 "actor")} ? movie? p? cast .', 권리? 불행하게도 이것은 (최소한 글쓰기의 시간에는) 타임 아웃으로 이어진다. BIND의 성능 문제와 비슷합니다. Blazegraph가 어떻게 최적화되어 있는지 알지 못합니다. 언뜻보기에는 간단한 쿼리처럼 보입니다. – AKSW
AKSW, 나는 내가 쓴 것에 착각했다. OP는 각 공용 영역 (예 : p : P171 및 ps : P161)에서 두 속성을 사용합니다. 그것은'values (? p? ps? role) ... '이어야합니다. 나는 [대답] (http://stackoverflow.com/a/43392591/1281433)을 추가했습니다. 결과는 거의 즉시입니다. –