跳到内容

SPARQL/WIKIDATA 限定词、引用和排名

来自维基教科书,开放世界开放书籍
维基数据数据模型

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

让我们看一下道格拉斯·亚当斯 (Q42) 以及他在哪里接受教育 (P69).

限定词

[编辑 | 编辑源代码]

让我们列出道格拉斯·亚当斯的教育以及限定词 开始时间 结束时间

SELECT ?education ?educationLabel ?starttime ?endtime
WHERE
{
     wd:Q42 p:P69 ?statement.
     ?statement ps:P69 ?education.
     ?statement pq:P580 ?starttime.
     ?statement pq:P582 ?endtime.
     SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
ORDER BY ?starttime

试试看!

前缀 p: 指向的不是对象,而是语句节点。然后,该节点就是其他三元组的主语。
语句节点内的前缀 ps: 检索对象。
语句节点内的前缀 pq: 检索限定词信息。

使用 [ ] 语法 可以通过消除变量 ?statement 来极大地缩写代码。

SELECT ?education ?educationLabel ?starttime ?endtime
WHERE
{
     wd:Q42 p:P69 [ps:P69 ?education;
                   pq:P580 ?starttime;
                   pq:P582 ?endtime;
                  ].
     SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
ORDER BY ?starttime

试试看!

让我们列出道格拉斯·亚当斯的教育以及所述 (P248) 引用

SELECT ?education ?educationLabel ?ref ?refLabel
WHERE
{
     wd:Q42 p:P69 ?statement.
     ?statement ps:P69 ?education.
     ?statement prov:wasDerivedFrom ?refnode.
     ?refnode   pr:P248 ?ref.
     SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}

试试看!

该前缀 p: 指向的不是对象,而是语句节点。然后,该节点就是其他三元组的主语。
语句节点内的前缀 ps: 检索对象。
语句节点内的 prov:wasDerivedFrom 指向新的引用节点。
引用节点内的前缀 pr: 检索引用信息。

使用 [ ] 语法 可以通过消除变量 ?statement?refnode 来极大地缩写代码。

SELECT ?education ?educationLabel ?ref ?refLabel
WHERE
{
     wd:Q42 p:P69 [ ps:P69 ?education;
                    prov:wasDerivedFrom 
                    [ pr:P248 ?ref; 
                    ]
                  ].
     SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}

试试看!

您可能已经注意到,以上查询中只列出了两种教育中的一种。要列出这两种,我们需要引入 OPTIONAL{ }。由于这只能与完整句子一起使用,因此我们需要使用包含三元组作为短句的完整展开语法

SELECT ?education ?educationLabel ?ref ?refLabel
WHERE
{
     wd:Q42 p:P69 ?statement.
     ?statement ps:P69 ?education.
     OPTIONAL{ ?statement prov:wasDerivedFrom ?refnode.
              ?refnode   pr:P248 ?ref.
             }
     SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}

试试看!

让我们列出道格拉斯·亚当斯的教育及其排名

SELECT ?education ?educationLabel ?rank
WHERE
{
     wd:Q42 p:P69 ?statement.
     ?statement ps:P69 ?education.
     ?statement wikibase:rank ?rank.
     SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}

试试看!

该前缀 p: 指向的不是对象,而是语句节点。然后,该节点就是其他三元组的主语。
语句节点内的前缀 ps: 检索对象。
语句节点内的 wikibase:rank 检索排名信息。

使用 [ ] 语法 可以通过消除变量 ?statement 来极大地缩写代码。

SELECT ?education ?educationLabel ?rank
WHERE
{
     wd:Q42 p:P69 [ps:P69 ?education;
                   wikibase:rank ?rank;
                  ].
     SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}

试试看!

一个具有不同排名的示例是柏林所处的(历史)国家。

# Berlins countries and ranking
SELECT ?country ?countryLabel ?rank
WHERE
{
     wd:Q64 p:P17 [ps:P17 ?country;
                   wikibase:rank ?rank;
                  ].
     SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}

试试看!

排名的三个可能值是 wikibase:PreferredRankwikibase:NormalRankwikibase:DeprecatedRank

将其与普通三元组进行比较,普通三元组将只选择具有最高排名的值。在这种情况下,只有首选排名值 德国 (Q183)

# Berlins countries via normal triples
SELECT ?country ?countryLabel
WHERE
{
     wd:Q64 wdt:P17 ?country.
     SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}

试试看!

查询中忽略排名

[编辑 | 编辑源代码]

排名可能会导致意外结果。例如,考虑以下查询,它将返回所有与阿尔芬 aan den Rijn (Q213246) 接壤的荷兰市。

select ?muni ?muniLabel where {
  ?muni wdt:P31 wd:Q2039348;
        wdt:P47 wd:Q213246.
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}

试试看!

这将不会显示博斯科普 (Q894442),因为其对 荷兰市 (Q2039348) 的排名是“普通”,而其他三个对实例 (P31) 的值是“首选”。为了在之前的查询中也看到博斯科普,请像这样重写查询

select ?muni ?muniLabel where {
  ?muni p:P31 [ps:P31 wd:Q2039348];
        wdt:P47 wd:Q213246.
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}

试试看!

或者使用属性路径来缩短查询,如下所示

select ?muni ?muniLabel where {
  ?muni p:P31/ps:P31 wd:Q2039348;
        wdt:P47 wd:Q213246.
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}

试试看!

示例
语句 wd:Q42 wdt:P69 wd:Q691283.
或 wd:Q42 p:P69 ?s. ?s ps:P69 wd:Q691283.
或 wd:Q42 p:P69 [ ps:P69 wd:Q691283 ].
维基数据数据模型
排名 wd:Q42 p:P69 [ wikibase:rank ?rank ].
限定词 wd:Q42 p:P69 [ pq:P580 ?qualifier ].
引用 wd:Q42 p:P69 [ prov:wasDerivedFrom [ pr:P248 ?ref ] ].
SPARQL data representation, as used by Wikidata Query Service Wikibase RDF mapping diagram

道格拉斯·亚当斯教育的完整查询,包括排名、限定词和引用,可能看起来像

# Douglas Adams education, with rank, qualifiers and references
SELECT ?education ?educationLabel ?rank ?starttime ?endtime ?ref ?refLabel
WHERE
{
     wd:Q42 p:P69 ?statement.
     ?statement ps:P69 ?education.
     # rank
     ?statement wikibase:rank ?rank.
     # qualifiers
     OPTIONAL{ ?statement pq:P580 ?starttime. }
     OPTIONAL{ ?statement pq:P582 ?endtime.   }
     # references
     OPTIONAL{ ?statement prov:wasDerivedFrom ?refnode.
               ?refnode   pr:P248 ?ref.
             }
     SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
ORDER BY ?starttime

试试看!


华夏公益教科书