无法过滤 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 个不同的代码(fra
和 fre
)。
根据 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)
但是我没有得到任何结果。
我怀疑这是因为 fre
和 fra
(因此 ?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
.
在 wikidata 上,使用以下查询:
SELECT ?item ?code
WHERE { ?item wdt:P219 ?code } # ISO 639-2 code (P219)
我找到了 ISO 639-2 中定义的所有语言,但对于某些语言(例如法语),我有 2 个不同的代码(fra
和 fre
)。
根据 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)
但是我没有得到任何结果。
我怀疑这是因为 fre
和 fra
(因此 ?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
.