gpt4 book ai didi

SPARQL:将多个谓词值组合成标签数组

转载 作者:行者123 更新时间:2023-12-02 02:44:38 25 4
gpt4 key购买 nike

现在我有一个查询,它返回特定实体的各种属性列表:

SELECT ?propLabel ?val WHERE {

BIND(wd:Q122426 as ?entity)
{
BIND(?entity AS ?valUrl)
BIND("n/a" AS ?propUrl)
BIND("name"@en AS ?propLabel)
?entity rdfs:label ?val.
FILTER((LANG(?val)) = "en")

# instance of
} UNION {
?entity wdt:P31 ?valUrl .
BIND("instance of"@en AS ?propLabel)

# filter isIRI(?valUrl)
?valUrl rdfs:label ?valLabel
FILTER (LANG(?valLabel) = "en")
BIND(CONCAT(?valLabel) AS ?val)

# occupation
} UNION {
?entity wdt:P106 ?val.
BIND("occupation"@en AS ?propLabel)

# position held
} UNION {
?entity wdt:P39 ?val.
BIND("position"@en AS ?propLabel)

# ... and more ...

}
}

这很好用,但它返回实体代码(Qxxxxx)而不是文本标签。所以我可以像这样改变它:
# occupation
} UNION {
?entity wdt:P106 ?valUrl.
BIND("occupation"@en AS ?propLabel)

?valUrl rdfs:label ?valLabel
FILTER (LANG(?valLabel) = "en")
BIND(CONCAT(?valLabel) AS ?val)

这工作正常。

但我的问题是

如何将多个谓词的值“折叠”为一个字符串?即对于谓词 P106、P119、Px、Py 等,得到:
| ?property   | ?valueLabel |
|-------------+-------------|
| tags | politician, Giza East Field, something else, something else |
| name | Henutsen |

有没有比 UNION 更有效的方式来构造查询?每个谓词?比如,只提供一个谓词列表 P31, P106, P39等等

最佳答案

这是一个替代 UNION 的版本带小巧VALUES条款,以及 label service 的使用(在评论中由 AKSW 提供):

SELECT ?entity ?property ?valueLabel {
VALUES ?entity { wd:Q122426 }
VALUES (?p ?property) {
(wdt:P31 "instance of"@en)
(rdfs:label "name"@en)
(wdt:P106 "occupation"@en)
(wdt:P39 "position"@en)
}
?entity ?p ?value
FILTER (!isLiteral(?value) || lang(?value) = "" || langmatches(lang(?value), "en"))
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}

结果:
| ?property   | ?valueLabel |
|-------------+-------------|
| instance of | human |
| occupation | politician |
| name | Henutsen |

将多行折叠成一行,以逗号分隔的列表作为值,理论上也是可能的,看起来像这样:
SELECT ?entity
(group_concat(?property; separator=", ") AS ?properties)
(group_concat(?valueLabel; separator=", ") AS ?values)
WHERE {
...
}
GROUP BY ?entity

原始查询插入在 ... .这个想法是使用 GROUP BY按实体对结果进行分组(这里不是绝对必要的,因为无论如何我们只有一个实体,但如果您想向查询添加更多实体),然后 group_concat将每个实体的所有值合并为一个值。

不幸的是,这由于某种原因不起作用; ?properties看起来不错,但 ?values是空的。它可能与“魔术”标签服务有关,可能与聚合不兼容。

更新:这是一个将名称和“标签”作为单独行返回的版本,如更新的问题所示:
SELECT ?property ?valueLabel {
{
SELECT
("tags" AS ?property)
(group_concat(?valueLabel; separator=", ") AS ?valueLabel)
WHERE {
VALUES ?p { wdt:P31 wdt:P106 wdt:P119 wdt:P39 }
wd:Q122426 ?p ?value
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}
} UNION {
BIND ("name"@en AS ?property)
wd:Q122426 rdfs:label ?valueLabel
FILTER langMatches(lang(?valueLabel), "en")
}
}

结果:
| ?property | ?valueLabel                        |
|-----------+------------------------------------|
| tags | human, politician, Giza East Field |
| name | Henutsen |

这个查询有点奇怪。请注意 ?valueLabel标签服务分配了一个值,但随后在 SELECT 中重新分配了一个不同的值内部子查询的子句。这种重新赋值在 SPARQL 中通常是不允许的,但这里实际上需要它来使查询工作。这似乎是标签服务的一个怪癖。

关于SPARQL:将多个谓词值组合成标签数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56192204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com