Wikidata SPARQL返回太多结果

时间:2018-03-30 09:09:45

标签: sparql semantic-web wikidata

这是可以在https://query.wikidata.org中执行的查询,我应该只获得17个值,但它返回289个结果(17 * 17 = 289)。 我想用它的单位获得财产价值。我指定wdt:P2573只是为了演示问题,在实际应用中,属性是变量?p

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

SELECT * WHERE {
  wd:Q2 wdt:P2573 ?o.
  wd:Q2 rdfs:label ?entName.
  ?realAtt wikibase:directClaim wdt:P2573.
  ?realAtt rdfs:label ?attName.
  ?realAtt wikibase:propertyType ?wdDataType.

  OPTIONAL {
    ?realAtt wikibase:statementValue ?psv.
    ?realAtt wikibase:claim ?pp.
    wd:Q2 ?pp ?quantityNode.
    ?quantityNode ?psv ?wdv.
    ?wdv wikibase:quantityUnit ?unit.
    ?wdv wikibase:quantityAmount ?qAmount.
    BIND(?qAmount AS ?val)
  }
  BIND(COALESCE(?val, ?o) AS ?val)


  BIND(COALESCE(?unit, "") AS ?unit)
  FILTER(((LANG(?o)) = "en") || ((LANG(?o)) = "") || (!ISLITERAL(?o)))
  FILTER(((LANG(?attName)) = "en") || ((LANG(?attName)) = ""))
  FILTER(((LANG(?entName)) = "en") || ((LANG(?entName)) = ""))
}

1 个答案:

答案 0 :(得分:3)

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

您的MCVE应如下所示:

SELECT * WHERE {
  wd:Q2 wdt:P2573 ?o.
  OPTIONAL {
    wd:Q2 p:P2573/psv:P2573 ?wdv.
    ?wdv wikibase:quantityUnit ?unit.
    ?wdv wikibase:quantityAmount ?qAmount.
    # FILTER( ?unit != wd:Q199 )
  }
}

Try it!

在上面的查询中,?o?wdv的唯一加入条件是它们与wd:Q2的关联。
因此,您获得了?o?wdv绑定的笛卡尔积(右,17×17 = 289)。

正确的查询应如下所示:

SELECT * WHERE {
  wd:Q2 p:P2573/psv:P2573 ?wdv.
  OPTIONAL {
    ?wdv wikibase:quantityUnit ?unit.
    ?wdv wikibase:quantityAmount ?qAmount.
  }
}

Try it!

<强>更新

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

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}
  }
}

Try it!

总的来说,陈述特征可以是多种多样的。以表格格式表示所有这些数据并不是很方便。这就是RDF存在的原因之一。