无法过滤 ISO 639-2 的术语代码

Can't filter on terminological codes for ISO 639-2

在 wikidata 上,使用以下查询:

SELECT ?item ?code
WHERE { ?item wdt:P219 ?code }  # ISO 639-2 code (P219)

我找到了 ISO 639-2 中定义的所有语言,但对于某些语言(例如法语),我有 2 个不同的代码(frafre)。

根据 ISO 639-2,这是正常的,因为它定义了术语和书目代码。

现在我的问题是如何过滤以仅获取其中一个?

我尝试执行以下操作:

SELECT ?item ?code
WHERE { ?item wdt:P219 ?code.  # ISO 639-2 code (P219)
        ?code wdt:P518 wd:Q1725664.}  # applies to part (P518), terminology (Q1725664)

如法国项目所述 (https://www.wikidata.org/wiki/Q150#identifiers)

但是我没有得到任何结果。

我怀疑这是因为 frefra(因此 ?code)是字符串而不是项目,但我仍然需要一个解决方案来过滤术语代码。

所以你有两个选择: 第一个,如评论中所述,是使用 sample 函数。如果您不关心您使用的是术语代码还是书目代码,这将起作用。 那么查询是:

SELECT ?item (SAMPLE(?code) AS ?sampleCode)
WHERE {
?item wdt:P219 ?code
}
GROUP BY ?item

如果您想选择一个特定的代码,在本例中是术语代码,则需要使用与已有代码类似的方法。

SELECT ?item ?code
WHERE { ?item p:P219 ?codeStatement.  # ISO 639-2 code (P219)
        ?codeStatement pq:P518 wd:Q1725664 ; # applies to part (P518), terminology (Q1725664)
                       ps:P219 ?code}  

上述方法与您的方法之间的区别在于使用的名称空间。这里我使用 p:ps:pq:,而不仅仅是 wdt:.

不同之处在于它们将我们引向一个关于三元组的声明

我们用p:P219找到所有关于P219的语句,用ps:219找到这些语句的对象。 所以:

SELECT ?item ?code
WHERE{
?item wdt:P219 ?code}

将得到与以下完全相同的结果:

SELECT DISTINCT ?item ?code
WHERE{
?item p:P219 ?codestatement .
?codestatement ps:P219 ?code.}

如果我们想对语句添加进一步的限制(例如,它必须只适用于术语),那么我们使用 pq: 命名空间,以及适当的 属性,在这种情况下P518.