我有一个维基基地运行的例子。我能够成功地使用维基数据运行联合查询。我有一些疑问,可以比较这样的标签:
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)我期望查询在结束时不使用"group“。但是如果没有它,就会出现某种交叉连接/笛卡儿乘积,匹配的每一项都重复总次数(n * n)。查询的哪个部分导致了这种情况?
发布于 2018-08-14 11:18:19
执行联邦查询时,本地Blazegraph会对Wikidata执行这类查询:
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没有发生在远程三重模式中--但是“认为”它们被传递了。
此错误导致您的两个问题:
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)。
也见
https://stackoverflow.com/questions/51814547
复制相似问题