VALUES子句中的路径匹配

时间:2019-01-29 22:30:50

标签: sparql wikidata

我正在尝试在sparql的VALUES子句内执行路径匹配,以匹配wikidata中战斗和围攻的所有实例子类。以下请求反复times out

SELECT DISTINCT ?battle ?battleLabel WHERE {
  {
    SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
    VALUES ?type {wd:Q178561 wd:Q188055} ?battle (wdt:P31/wdt:P279*) ?type .
    ?battle rdfs:label ?queryByTitle.
    FILTER(REGEX(?queryByTitle, "saratoga", "i"))
  }
}

1 个答案:

答案 0 :(得分:2)

似乎VALUES,尤其是。在这种情况下,与/结合使用会使Blazegraph的查询优化器混乱。

使用UNION代替VALUES

SELECT DISTINCT ?battle ?battleLabel WHERE {
    { ?battle wdt:P31/wdt:P279* wd:Q178561 }
    UNION
    { ?battle wdt:P31/wdt:P279* wd:Q188055 }
    ?battle rdfs:label ?queryByTitle.
    FILTER(REGEX(?queryByTitle, "saratoga", "i"))
    SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en" }
}

或者,禁用优化器并指定显式顺序:

SELECT DISTINCT ?battle ?battleLabel WHERE {
    hint:Query hint:optimizer "None" .
    VALUES ?type {wd:Q178561 wd:Q188055}
    ?subtype wdt:P279* ?type .
    ?battle wdt:P31 ?subtype .
    ?battle rdfs:label ?queryByTitle.
    FILTER(REGEX(?queryByTitle, "saratoga", "i"))
    SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en" }
}