跳转到内容

SPARQL/WIKIDATA 精度、单位和坐标

来自维基教科书,开放世界中的开放书籍
维基数据数据值

WIKIDATA 上的数据包含的信息不仅仅是三元组。有关完整描述,请参阅维基数据:词汇表.

维基数据上的值通常具有附加信息,例如精度、单位等。维基数据对几乎所有事物的解决方案都是更多三元组。这意味着更多前缀

对于实体,没有其他信息。

字符串

[编辑 | 编辑源代码]

对于字符串,没有其他信息。

# examples of dates, precision, time zones and calendars
SELECT ?time ?timeprecision ?timezone ?timecalendar ?timecalendarLabel
WHERE
{
     { wd:Q5598  p:P569/psv:P569 ?timenode. }  # Jul 15, 1606
     UNION 
     { wd:Q220   p:P571/psv:P571 ?timenode. } # 13 April 753 BCE
     UNION 
     { wd:Q1     p:P580/psv:P580 ?timenode. } # 13798 million years BCE
  
     ?timenode wikibase:timeValue         ?time.
     ?timenode wikibase:timePrecision     ?timeprecision.
     ?timenode wikibase:timeTimezone      ?timezone.
     ?timenode wikibase:timeCalendarModel ?timecalendar.
  
     SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}

试试吧!

前缀p:指向一个语句节点。
前缀psv:在语句节点内检索一个时间节点。
时间节点内的wikibase:timeValue检索时间。
时间节点内的wikibase:timePrecision检索时间的精度。

精度的代码为 0:十亿年,1:一亿年,3:百万年,4:十万年,5:一万年,6:千年,7:世纪,8:十年,9:年,10:月,11:日,12:小时,13:分钟,14:秒。

时间节点内的wikibase:timeTimezone检索时区,以分钟为单位的UTC偏移量。
时间节点内的wikibase:timeCalendarModel检索日历,一个常用的值为推算格里高利历 (Q1985727).


关于日期过滤的评论。
在过滤日期时,应添加代码^^xsd:dateTime,例如

FILTER("2015-01-01"^^xsd:dateTime <= ?dob && ?dob < "2016-01-01"^^xsd:dateTime).

单语文本

[编辑 | 编辑源代码]

对于单语文本,没有其他信息。文本表示为带有语言标记的字符串文字。它只有简单的值。

#Countries in European Union with native name and language
SELECT ?country ?countryLabel ?nativename ?language
{
  wd:Q458 wdt:P150 ?country.   # European Union  contains administrative territorial entity
  OPTIONAL { ?country wdt:P1705 ?nativename.
              BIND( LANG(?nativename) AS ?language). }
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
ORDER BY DESC(?language)

试试吧!

# Museums in Barcelona with coordinates
SELECT ?item ?itemLabel ?coord ?lon ?lat
WHERE
{
 ?item wdt:P131 wd:Q1492.   # in the administrative territory of Barcelona
 ?item wdt:P31 wd:Q33506.   # is a museum
 ?item p:P625 ?coordinate.
 ?coordinate ps:P625 ?coord.
 ?coordinate psv:P625 ?coordinate_node.
 ?coordinate_node wikibase:geoLongitude ?lon.
 ?coordinate_node wikibase:geoLatitude ?lat.  
 SERVICE wikibase:label { bd:serviceParam wikibase:language "en". } 
}

试试吧!

前缀p:指向一个语句节点。
前缀ps:在坐标语句节点内检索完整的坐标,例如Point(2.1749 41.3834)。
前缀psv:在语句节点内检索一个坐标节点。
坐标节点内的wikibase:geoLongitude检索经度值。
坐标节点内的wikibase:geoLatitude检索纬度值。
坐标节点内的wikibase:geoGlobe检索地球物体。对于地球上的坐标,它将是地球 (Q2).
坐标节点内的wikibase:geoPrecision检索坐标值的精度,以度为单位。乘以111000转换为米。

以下是一些不在地球上的山脉的示例。

# Mountains, with coordinates, not located on Earth
SELECT ?item ?name ?coord ?lon ?lat ?globe ?globeLabel
{
   ?item wdt:P31 wd:Q8502;                 # is a mountain
         p:P625 [
           ps:P625 ?coord;
           psv:P625 [
             wikibase:geoLongitude ?lon;
             wikibase:geoLatitude ?lat;
             wikibase:geoGlobe ?globe;
           ] ;
         ]
  FILTER ( ?globe != wd:Q2 )              # globe is not earth
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en" .
                           ?item  rdfs:label ?name.
                           ?globe rdfs:label ?globeLabel.
                         }
}
ORDER BY ?globeLabel ?name

试试吧!

# Longest rivers in the USA
SELECT ?item ?itemLabel ?length ?unitLabel ?lowerbound ?upperbound ?precision ?length2 ?conversion ?length_in_m 
WHERE
{
  ?item          wdt:P31/wdt:P279*           wd:Q4022.    # rivers
  ?item          wdt:P17                     wd:Q30.      # country USA
  ?item          p:P2043                     ?stmnode.    # length
  ?stmnode       psv:P2043                   ?valuenode.
  ?valuenode     wikibase:quantityAmount     ?length.
  ?valuenode     wikibase:quantityUnit       ?unit.
  ?valuenode     wikibase:quantityLowerBound ?lowerbound.
  ?valuenode     wikibase:quantityUpperBound ?upperbound.
  BIND((?upperbound-?lowerbound)/2 AS ?precision).
  BIND(IF(?precision=0, ?length, (CONCAT(str(?length), "±", str(?precision)))) AS ?length2). 

  # conversion to SI unit
  ?unit          p:P2370                 ?unitstmnode.   # conversion to SI unit
  ?unitstmnode   psv:P2370               ?unitvaluenode. 
  ?unitvaluenode wikibase:quantityAmount ?conversion.
  ?unitvaluenode wikibase:quantityUnit   wd:Q11573.      # meter
  BIND(?length * ?conversion AS ?length_in_m).
  
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
} 
ORDER BY DESC(?length_in_m)
LIMIT 10

试试吧!

前缀p:指向一个语句节点。
前缀psv:在语句节点内检索一个值节点。
值节点内的wikibase:quantityAmount检索数量值。
值节点内的wikibase:quantityUnit检索单位。并非所有数量都有单位。
wikibase:quantityLowerBoundwikibase:quantityUpperBound可用于指示精度。

在单位内,您可以检索将单位转换为SI单位等的语句。在示例中,密西西比河的长度以英里为单位,可以转换为SI单位。如果某些长度以米为单位,而另一些以公里为单位,则也可能需要转换。

一些变量仅用于演示。没有它们,查询将是

# Longest rivers in the USA
SELECT ?item ?itemLabel ?length2 ?unitLabel ?length_in_m 
WHERE
{
  ?item          wdt:P31/wdt:P279*           wd:Q4022.    # rivers
  ?item          wdt:P17                     wd:Q30.      # country USA
  ?item          p:P2043                     ?stmnode.    # length
  ?stmnode       psv:P2043                   ?valuenode.
  ?valuenode     wikibase:quantityAmount     ?length.
  ?valuenode     wikibase:quantityUnit       ?unit.
  ?valuenode     wikibase:quantityLowerBound ?lowerbound.
  ?valuenode     wikibase:quantityUpperBound ?upperbound.
  BIND((?upperbound-?lowerbound)/2 AS ?precision).
  BIND(IF(?precision=0, ?length, (CONCAT(str(?length), "±", str(?precision)))) AS ?length2). 

  # conversion to SI unit
  ?unit          p:P2370                 ?unitstmnode.   # conversion to SI unit
  ?unitstmnode   psv:P2370               ?unitvaluenode. 
  ?unitvaluenode wikibase:quantityAmount ?conversion.
  ?unitvaluenode wikibase:quantityUnit   wd:Q11573.      # meter
  BIND(?length * ?conversion AS ?length_in_m).
  
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
} 
ORDER BY DESC(?length_in_m)
LIMIT 10

试试吧!

通过使用[ ] 语法,可以通过消除节点变量和未使用的变量来缩短代码。

# Longest rivers in the USA
SELECT ?item ?itemLabel ?length2 ?unitLabel ?length_in_m 
WHERE
{
  ?item  wdt:P31/wdt:P279* wd:Q4022.    # rivers
  ?item  wdt:P17           wd:Q30.      # country USA
  ?item  p:P2043/psv:P2043 [            # length
     wikibase:quantityAmount     ?length;
     wikibase:quantityUnit       ?unit;
     wikibase:quantityLowerBound ?lowerbound;
     wikibase:quantityUpperBound ?upperbound;
  ]
  BIND((?upperbound-?lowerbound)/2 AS ?precision).
  BIND(IF(?precision=0, ?length, (CONCAT(str(?length), "±", str(?precision)))) AS ?length2). 

  # conversion to SI unit
  ?unit p:P2370/psv:P2370 [                # conversion to SI unit
     wikibase:quantityAmount ?conversion;
     wikibase:quantityUnit wd:Q11573;      # meter
  ]
  BIND(?length * ?conversion AS ?length_in_m).
  
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
} 
ORDER BY DESC(?length_in_m)
LIMIT 10

试试吧!

标准化单位

[编辑 | 编辑源代码]

使用前缀psn:(标准化)代替psv:,可以自动转换单位,而不是通过SPARQL代码进行转换。

# Longest rivers in the USA, normalised units
SELECT ?item ?itemLabel ?length ?unitLabel ?lowerbound ?upperbound ?precision ?length2
WHERE
{
  ?item          wdt:P31/wdt:P279*           wd:Q4022.    # rivers
  ?item          wdt:P17                     wd:Q30.      # country USA
  ?item          p:P2043                     ?stmnode.    # length
  ?stmnode       psn:P2043                   ?valuenode.  # normalised value
  ?valuenode     wikibase:quantityAmount     ?length.
  ?valuenode     wikibase:quantityUnit       ?unit.
  ?valuenode     wikibase:quantityLowerBound ?lowerbound.
  ?valuenode     wikibase:quantityUpperBound ?upperbound.
  BIND((?upperbound-?lowerbound)/2 AS ?precision).
  BIND(IF(?precision=0, ?length, (CONCAT(str(?length), "±", str(?precision)))) AS ?length2). 
    
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
} 
ORDER BY DESC(?length)
LIMIT 10

试试吧!

前缀psv:在语句节点内检索一个值节点。
前缀psn:在语句节点内检索一个标准化值节点。请注意,使用psn:的查询将只为您提供此列表中存在的单位的值。[1]

注意,单位从公里和英里更改为米,所有值都相应地计算。上下限值也相应改变。现在的精度以米为单位。

标准化数量值是与原始数据节点平行的值节点,但以基本单位表示。它们通过前缀具有“v”替换为“n”的谓词连接到其父节点 - 即 psn:prn:(用于引用)和 pqn:(用于限定词)。

通过使用 [ ] 语法,可以通过消除节点变量和未使用的变量来缩短代码。

# Longest rivers in the USA, normalised units
SELECT ?item ?itemLabel ?length2 ?unitLabel
WHERE
{
  ?item  wdt:P31/wdt:P279* wd:Q4022.    # rivers
  ?item  wdt:P17           wd:Q30.      # country USA
  ?item  p:P2043/psn:P2043 [            # length, normalised
     wikibase:quantityAmount     ?length;
     wikibase:quantityUnit       ?unit;
     wikibase:quantityLowerBound ?lowerbound;
     wikibase:quantityUpperBound ?upperbound;
  ]
  BIND((?upperbound-?lowerbound)/2 AS ?precision).
  BIND(IF(?precision=0, ?length, (CONCAT(str(?length), "±", str(?precision)))) AS ?length2). 

  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
} 
ORDER BY DESC(?length)
LIMIT 10

试试吧!

项目 语句节点 值节点
p:Pxxx
psv:Pxxx
或 psn:Pxxx(标准化)
时间值
wikibase:timeValue
wikibase:timePrecision
wikibase:timeTimezone
wikibase:timeCalendarModel
坐标值
wikibase:geoLongitude
wikibase:geoLatitude
wikibase:geoGlobe
wikibase:geoPrecision
数量值
wikibase:quantityAmount
wikibase:quantityUnit
wikibase:quantityLowerBound
wikibase:quantityUpperBound
wikibase:quantityAmount

SPARQL data representation, as used by Wikidata Query Service


  1. 例如,您可以看到这两个查询并没有给出完全相同的值。第二个查询中缺少一些值。
    #身高超过2.25米的男性 SELECT ?taillem ?item WHERE {?item wdt:P31 wd:Q5 ; p:P2048 [psv:P2048 ?t ] . ?t wikibase:quantityAmount ?taille . ?t wikibase:quantityUnit/p:P2370/psv:P2370 [wikibase:quantityAmount ?conversion ; wikibase:quantityUnit wd:Q11573] . BIND(?taille * ?conversion AS ?taillem). filter(?taillem > 2.25) } order by desc (?taillem) 
    试试看!
    #身高超过2.25米的男性 SELECT ?taille ?item WHERE {?item wdt:P31 wd:Q5 ; p:P2048/psn:P2048 [wikibase:quantityAmount ?taille ]. filter(?taille > 2.25) } order by desc (?taille) 
    试试看!
华夏公益教科书