比较联合查询中的标签 [英] comparing labels in a federated query
本文介绍了比较联合查询中的标签的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在运行一个Wikibase实例。我能够成功地使用Wikidata运行联合查询。我有这样比较标签的某些查询:
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)我最初将filter(contains(?wditemlabel, ?itemLabel))
放在SERVICE子句中,它没有返回任何结果。但如果我为其中一个变量使用静态字符串(例如filter(contains("test string", ?itemLabel))
),它似乎可以工作。为什么它在比较变量和字符串而不是两个变量时会起作用?
2)我希望查询在末尾不使用"group by"即可工作。但看起来如果没有它,就会出现某种交叉连接/笛卡尔乘积,并且匹配的每一项都会重复总次数(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
不会出现在远程三元组模式中--但"认为"它们已传递。
此错误会导致您的两个问题:
- Try the above query on Wikidata(0个结果)
- Try the above query on Wikidata不包含
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(?wditemlabel, ?itemLabel)
替换为contains(str(?wditemlabel), str(?itemLabel))
。
另见
Federated Query(Blazegraph Wiki)
Speed up federated query(SO上的问题)
这篇关于比较联合查询中的标签的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文