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:quantityLowerBound
和wikibase: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 |
- ↑ 例如,您可以看到这两个查询并没有给出完全相同的值。第二个查询中缺少一些值。 试试看!
#身高超过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)