首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较联邦查询中的标签

比较联邦查询中的标签
EN

Stack Overflow用户
提问于 2018-08-13 02:40:33
回答 1查看 314关注 0票数 1

我有一个维基基地运行的例子。我能够成功地使用维基数据运行联合查询。我有一些疑问,可以比较这样的标签:

代码语言:javascript
复制
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)。查询的哪个部分导致了这种情况?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-14 11:18:19

执行联邦查询时,本地Blazegraph会对Wikidata执行这类查询:

代码语言:javascript
复制
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. 试试上面对Wikidata的查询 (0结果)
  2. 没有试试上面对Wikidata的查询contains (82800结果而不是828)

解决方案

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

代码语言:javascript
复制
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))
}

代码语言:javascript
复制
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)

也见

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51814547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档