是否可以进行更快的 filter-IN 查询?

Is possible to do faster filter-IN queries?

这个查询对于"WHERE IN"来说似乎很懒...因为不需要检查"the universe",只需要很少的IN ()设置。

SELECT ?item ?itemLabel ?of ?ofLabel
WHERE 
{
  ?item wdt:P31 ?of.
  FILTER ( ?item IN (
    wd:Q28114532, wd:Q27745011,wd:Q3415363,wd:Q3415324,wd:Q2877432,wd:Q2877444,
    wd:Q2396644,wd:Q3444776,wd:Q2877428,wd:Q578757,wd:Q2877445,wd:Q2333617
  ) )
  SERVICE wikibase:label { 
     bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en".
  }
}

有另一种方法可以更快地完成同样的事情吗?


注意

问题随着类似的事情而增长,但检查项目是否有 "any dependency" — 实例、子实例、class 或子class 某物(例如 Q7860962 ).

SELECT ?item ?itemLabel ?x ?xLabel
WHERE 
{
  ?x (wdt:P31|wdt:P279)* wd:Q7860962 .
  ?item wdt:P31 ?x .
  FILTER ( ?item IN (
    wd:Q28114532, wd:Q27745011,wd:Q3415363,wd:Q3415324,wd:Q2877432,wd:Q2877444,
    wd:Q2396644,wd:Q3444776,wd:Q2877428,wd:Q578757,wd:Q2877445,wd:Q2333617
  ) )
  SERVICE wikibase:label { 
     bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en".
  }
}

正如@AKSW 指出的那样,您可以使用 VALUES。您的第一个查询将快约 150 倍:

SELECT ?item ?itemLabel ?of ?ofLabel
WHERE 
{ VALUES (?item) {
      (wd:Q28114532) (wd:Q27745011) (wd:Q3415363) (wd:Q3415324) (wd:Q2877432) (wd:Q2877444)
      (wd:Q2396644)  (wd:Q3444776)  (wd:Q2877428) (wd:Q578757)  (wd:Q2877445) (wd:Q2333617)
  }
  ?item wdt:P31 ?of.
  SERVICE wikibase:label  { 
     bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en".
  }
}

Try it!

在您的第二个查询中,您还应该添加 hint:Prior hint:gearing "forward":

SELECT ?item ?itemLabel ?x ?xLabel
WHERE 
{
  VALUES (?item) {
      (wd:Q28114532) (wd:Q27745011) (wd:Q3415363) (wd:Q3415324) (wd:Q2877432) (wd:Q2877444)
      (wd:Q2396644)  (wd:Q3444776)  (wd:Q2877428) (wd:Q578757)  (wd:Q2877445) (wd:Q2333617)
  }
  ?item wdt:P31 ?x .
  ?x (wdt:P31|wdt:P279)* wd:Q7860962 .
  hint:Prior hint:gearing "forward" .
  SERVICE wikibase:label { 
     bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en".
  }
}

Try it!