比较联合查询中的标签



我有一个正在运行的Wikibase实例。我能够成功地运行维基数据的联合查询。我有一些查询可以比较这样的标签:

PREFIX xwdt: <http://www.wikidata.org/prop/direct/>
PREFIX xwd: <http://www.wikidata.org/entity/>
PREFIX xpq: <http://www.wikidata.org/prop/qualifier/>
PREFIX xps: <http://www.wikidata.org/prop/statement/>
PREFIX xp: <http://www.wikidata.org/prop/>
select ?item  ?wditem ?itemLabel ?wid ?wditemlabel
where {
?item wdt:P17 wd:Q39.
?item wdt:P31 wd:Q5.
optional {
?item wdt:P14 ?wid .
}
?item rdfs:label ?itemLabel.   
SERVICE <https://query.wikidata.org/sparql> {
?wditem xwdt:P27 xwd:Q258.
?wditem xwdt:P106 xwd:Q937857.
?wditem rdfs:label ?wditemlabel.
filter(LANGMATCHES(LANG(?wditemlabel), "en")).
}
filter(contains(?wditemlabel, ?itemLabel))
}
group by ?item ?itemLabel ?wid ?wditem ?wditemlabel

但是,上述方法可以通过标签来匹配项目:

1( 我最初在 SERVICE 子句中filter(contains(?wditemlabel, ?itemLabel)),但它没有返回任何结果。但是如果我对其中一个变量使用静态字符串(例如filter(contains("test string", ?itemLabel))(。为什么在比较变量和字符串而不是两个变量时它会起作用?

2(我希望查询可以在没有最后"分组依据"的情况下工作。但看起来没有它,会发生某种交叉连接/笛卡尔积,并且匹配的每个项目都重复了总数 (n * n(。查询的哪一部分导致此问题?

执行联合查询时,您的本地 Blazegraph 对维基数据执行此类查询:

SELECT ?wditem ?wditemlabel
WHERE {
?wditem wdt:P27 wd:Q258.
?wditem wdt:P106 wd:Q937857.
?wditem rdfs:label ?wditemlabel.
filter(LANGMATCHES(LANG(?wditemlabel), "en"))
filter(contains(?wditemlabel, ?itemlabel))
}
VALUES () {
( ) ( ) ( ) ( ) ( )  ( ) ( ) ( ) ( ) ( )  ( ) ( ) ( ) ( ) ( )  ( ) ( ) ( ) ( ) ( )
( ) ( ) ( ) ( ) ( )  ( ) ( ) ( ) ( ) ( )  ( ) ( ) ( ) ( ) ( )  ( ) ( ) ( ) ( ) ( )
( ) ( ) ( ) ( ) ( )  ( ) ( ) ( ) ( ) ( )  ( ) ( ) ( ) ( ) ( )  ( ) ( ) ( ) ( ) ( )
( ) ( ) ( ) ( ) ( )  ( ) ( ) ( ) ( ) ( )  ( ) ( ) ( ) ( ) ( )  ( ) ( ) ( ) ( ) ( )
( ) ( ) ( ) ( ) ( )  ( ) ( ) ( ) ( ) ( )  ( ) ( ) ( ) ( ) ( )  ( ) ( ) ( ) ( ) ( )
} # 100 values

如您所见,Blazegraph "忘记"将?itemLabel的本地绑定传递到VALUES中——可能是因为?itemLabel不会以远程三重模式发生——但"认为"它们被传递了。

此错误会导致您的两个问题:

  1. 在维基数据上尝试上述查询 (0 结果(
  2. 在没有contains的情况下在维基数据上尝试上述查询(82800结果而不是828(

解决方法

使用提示强制查询执行顺序:

select ?item ?wditem ?itemLabel ?wditemlabel
where {
hint:Query hint:optimizer "None"
SERVICE <https://query.wikidata.org/sparql> {
?wditem wdt:P27 wd:Q258.
?wditem wdt:P106 wd:Q937857.
?wditem rdfs:label ?wditemlabel.
filter(lang(?wditemlabel)= "en").
} 
?item wdt:P17 wd:Q39.
?item wdt:P31 wd:Q5.
?item rdfs:label ?itemLabel.
filter(contains(?wditemlabel, ?itemLabel))
}

select ?item ?wditem ?itemLabel ?wditemlabel
where {
?item wdt:P17 wd:Q39.
?item wdt:P31 wd:Q5.
?item rdfs:label ?itemLabel.
SERVICE <https://query.wikidata.org/sparql> {
?wditem wdt:P27 wd:Q258.
?wditem wdt:P106 wd:Q937857.
?wditem rdfs:label ?wditemlabel.
filter(lang(?wditemlabel)= "en").
}
hint:Prior hint:runFirst true .
filter(contains(?wditemlabel, ?itemLabel))
}

顺便说一下,您可以在原始查询中使用DISTINCT而不是GROUP BY,或者使用其他本地过滤,即filter(lang(?itemLabel)='ast').

比较

在 GraphDB 中,原始查询运行良好,但应该用contains(str(?wditemlabel), str(?itemLabel))替换contains(?wditemlabel, ?itemLabel)

参见

  • Federated Query (Blazegraph wiki(

  • 加快联合查询(关于 SO 的问题(

最新更新