检索链中作为实例或子实例或子子实例的所有项目

时间:2018-08-02 19:30:19

标签: query-optimization sparql wikidata

我需要一个关于某项或其父项(实例父项或子类父项)的所有有效语句的逻辑OR

示例:Q957653Q3184121的实例,最后一个有?item P17 Q155。这样就可以满足Q957653 P31 Q3184121 P17 Q155的需求了...所以我需要一些东西

    ?item P17 Q155
    | ?item P31 ?x P17 Q155
    | ?item P31 ?x P31 ?y P17 Q155
    | ?item P279 ?x P17 Q155
    | ?item P279 ?x P31 ?y P17 Q155
    | ?item P279 ?x P279 ?y P17 Q155

对于所有可能的P31或P279依赖关系链,一个大逻辑“或”。


真实示例

我需要一个具有某些属性(例如?item wdt:P402 _:b0.)的项列表,这些项是具有其他属性(例如)的项的实例或子类。 wdt:P17 wd:Q155

?item wdt:P17 wd:Q155的“第一级”运行正常,

SELECT DISTINCT ?item ?osm_relid ?itemLabel 
WHERE {
  ?item wdt:P402 _:b0.
  ?item wdt:P17 wd:Q155.
  OPTIONAL { ?item wdt:P1448 ?name. }
  OPTIONAL { ?item wdt:P402 ?osm_relid .}
  SERVICE wikibase:label { 
      bd:serviceParam wikibase:language "en,[AUTO_LANGUAGE]". 
  }
}

但是如何表达所有其他可能依赖性的 union (或逻辑“或”)?

编辑/注释

根据需要,假设?item wdt:P31*/wdt:P279* wd:Qxx .都是“某些Qxx的链依赖项” ...但是Qxx也是一个查询,
?item wdt:P31*/wdt:P279* (?xx wdt:P17 wd:Q155) .

... 似乎有解决方案(!)

SELECT  (COUNT(DISTINCT ?item) AS ?count) 
WHERE {
  ?item wdt:P402 _:b0.
  ?item  (wdt:P31*|wdt:P279*)/wdt:P17 wd:Q155 .
}

但是我无法检查,因为这很耗时。

...可能接近“可行解决方案”的是
?item wdt:P31*/wdt:P279*/wdt:P31*/wdt:P17 wd:Q155 .
...经过可行性测试,似乎wdt:P31*/wdt:P279*/wdt:P17是唯一没有超时问题的“最佳”。

1 个答案:

答案 0 :(得分:2)

为了提高性能,可以使用Blazegraph query hints。查询提示允许修改自动生成的查询执行计划。

SELECT DISTINCT ?item ?itemLabel ?osm_relid ?name {
  ?itemi wdt:P17 wd:Q155 .
  hint:Prior hint:runFirst true .
  ?item (wdt:P31|wdt:P279)* ?itemi .
  ?item wdt:P625 [].
  OPTIONAL { ?item wdt:P1448 ?name. }
  OPTIONAL { ?item wdt:P402 ?osm_relid .}
  SERVICE wikibase:label { 
      bd:serviceParam wikibase:language "en,[AUTO_LANGUAGE]". 
  }
}

Try it!

This是查询执行计划的外观(只需将&explain添加到查询URL并向下滚动)。

请注意,使用标签服务时,您can't使用原始注释中的hint:Prior hint:runLast true:在任何图形模式组中只能有一个这样的提示。