Wikidata SPARQL返回的结果太多

Wikidata SPARQL返回的结果太多,sparql,semantic-web,wikidata,Sparql,Semantic Web,Wikidata,这是可以在中执行的查询,我应该只得到17个值,但它返回289个结果17*17=289。 我想用它的单位得到属性值。我指定wdt:P2573只是为了说明这个问题,在实际应用中,属性是一个变量?p truthy语句的简单值不会自动与值节点连接 您的应用程序应该如下所示: 选择*WHERE{ wd:Q2 wdt:P2573?o。 可选的{ wd:Q2 p:P2573/psv:P2573?wdv。 ?wdv wikibase:quantityUnit?单位。 ?wdv wikibase:quantity

这是可以在中执行的查询,我应该只得到17个值,但它返回289个结果17*17=289。 我想用它的单位得到属性值。我指定wdt:P2573只是为了说明这个问题,在实际应用中,属性是一个变量?p

truthy语句的简单值不会自动与值节点连接

您的应用程序应该如下所示:

选择*WHERE{ wd:Q2 wdt:P2573?o。 可选的{ wd:Q2 p:P2573/psv:P2573?wdv。 ?wdv wikibase:quantityUnit?单位。 ?wdv wikibase:quantityAmount?qAmount。 过滤器?单位!=wd:Q199 } } 在上面的查询中,?o和?wdv的唯一连接条件是它们与wd:Q2的关系。 因此,您将获得?o和?wdv绑定的笛卡尔乘积,即17×17=289

正确的查询应如下所示:

选择*WHERE{ wd:Q2 p:P2573/psv:P2573?wdv。 可选的{ ?wdv wikibase:quantityUnit?单位。 ?wdv wikibase:quantityAmount?qAmount。 } } 更新

以上查询仅适用于。显然,它不适用于时间或全球坐标。此外,有时语句根本没有完整的值。例如,带有字符串对象的语句只有简单的值。应该从语句中获取简单值,然后尝试从完整值中获取其他信息:

SELECT * {
  VALUES (?wd) {(wd:P2067)(wd:P1332)(wd:P1814)}
  ?wd wikibase:claim ?p;
      wikibase:statementProperty ?ps;
      wikibase:statementValue ?psv.
  wd:Q2 ?p ?wds.
  ?wds ?ps ?sv.
  OPTIONAL {
    ?wds ?psv ?wdv
    OPTIONAL {?wdv wikibase:quantityUnit ?unit.
    ?wdv wikibase:quantityAmount ?amount}
  }
}

总的来说,语句的特征可能非常多样。以表格格式表示所有这些数据不是很方便。这就是RDF存在的原因之一。

谢谢,现在我了解了更多,从图表中,我可以确认我是否总是可以直接从值节点获取值,而忽略简单的值。无论简单值中的值是什么,它也将始终存在于值节点中,对吗?不。例如,字符串没有完整值:请参阅。我想你只对数量感兴趣。否则,应该从语句wds中获取简单值:。。。然后试着从全值wdv中得到额外的特征:……比如。啊,好吧,我的错误,我的意思是说,无论wdt的值是什么:。。。wds:或wdv:中始终会有一个值,对吗?这样我就可以从wds/wdv中读取值,而忽略wdt的值。注意:wdv不总是存在:是的,始终可以使用p..:/ps:。。路径在某些情况下,可以使用p..:/psv:../wikibase。。路径请注意,也存在所谓的规范化值。它们显示在网页上,可能不同于简单值和完整值。顺便说一句,这应该很难在表格格式中表示所有这些内容。这就是链接数据存在的原因之一。。。
SELECT * {
  VALUES (?wd) {(wd:P2067)(wd:P1332)(wd:P1814)}
  ?wd wikibase:claim ?p;
      wikibase:statementProperty ?ps;
      wikibase:statementValue ?psv.
  wd:Q2 ?p ?wds.
  ?wds ?ps ?sv.
  OPTIONAL {
    ?wds ?psv ?wdv
    OPTIONAL {?wdv wikibase:quantityUnit ?unit.
    ?wdv wikibase:quantityAmount ?amount}
  }
}