进入酒店的财产

时间:2016-04-12 22:23:58

标签: sparql triplestore triples wikidata

我有以下查询,我在wikidata query service web interface上运行:

SELECT ?objectLabel ?mass
WHERE {
  ?object wdt:P397 wd:Q525.  # the object should have the sun as parent astronomical body
  ?object wdt:P31 ?status.
  ?object wdt:P2067 ?mass.

  # Here are the accepted object status
  VALUES ?status {wd:Q128207 wd:Q121750 wd:Q1319599}.  # terrestrial planet, gas giant, ice giant

  # automatically use the english label for ?xLabel variables 
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
} 

我发现mass值在特定unit中给出,如果是地球,则为yottagram。 如何访问此信息?

我尝试添加类似的内容:

?mass   wdt:P2237 ?mass_unit.

但是,预计这不起作用,因为?mass是一个整数,而不是引用地球质量的对象。 使用属性本身作为主题不起作用:

?object wdt:P2067 ?mass.
wd:P2067 wdt:P2237 ?massUnit.

returns所有可用单元的所有元组。 (地球与5972.37公斤,5972.37 yottagrams,5972.37太阳质量等相关联)

此外,链接属性会导致no results

?object wdt:P2067/wdt:P2237 ?massUnit.

我想我需要使用,而不是属性本身,而是它的一个实例,它特定地连接地球和描述其质量的整数。

如何访问单位信息? (如果是地球,Yottagram

2 个答案:

答案 0 :(得分:4)

在MediaWiki.org页面Wikibase/Indexing/RDF Dump Format中描述了如何在RDF中表示维基数据(因此在SPARQL中)。

相关部分是,在您的情况下,wdt:P2067直接为您提供了值,但如果您改为使用p:P2067,则会获得整个语句。从那里,您可以使用psv:P2067获取值节点。从那里开始,您可以使用wikibase:quantityAmount获取质量(就像使用wdt:P2067一样),但您也可以使用wikibase:quantityUnit来获取代表该单位的实体。

因此,整个查询可能如下所示:

SELECT ?objectLabel ?mass ?massUnitLabel
WHERE {
  ?object wdt:P397 wd:Q525.  # the object should have the sun as parent astronomical body
  ?object wdt:P31 ?status.

  ?object p:P2067/psv:P2067 ?massValue.
  ?massValue wikibase:quantityAmount ?mass.
  ?massValue wikibase:quantityUnit ?massUnit.

  # Here are the accepted object status
  VALUES ?status {wd:Q128207 wd:Q121750 wd:Q1319599}.  # terrestrial planet, gas giant, ice giant

  # automatically use the english label for ?xLabel variables 
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}

如果您愿意,可以使用以下代码消除?massValue变量:

?object p:P2067/psv:P2067 [
  wikibase:quantityAmount ?mass;
  wikibase:quantityUnit ?massUnit ] 

答案 1 :(得分:0)

RDF文字由XSD数据类型键入,SPARQL的datatype()可用于查找类型。因此,请在SELECT语句中尝试查找?mass的类型:

SELECT ?objectLabel ?mass (datatype(?mass) AS ?masstype)
....