嗨,我的结果输出如下:
?name ?o ?x
------------
ABCD xyz ghh
PQR xyz hij
如何将 ?o 和 ?x 列合并到称为论文的一列中? 我需要这样的输出:
?name ?papers
--------------
ABCD (xyz, ghh, hij)
请注意,PQR 和 ABCD 仅被 ABCD 替换。 ABCD 和 PQR 具有相同的属性,称为 mbox_sha1sum
以上两个是例子。我需要它们像这样:
这是当前的 sparql 查询:
PREFIX xmlns: <http://xmlns.com/foaf/0.1/>
PREFIX ontoware: <http://swrc.ontoware.org/ontology#>
SELECT DISTINCT ?name ?x ?o
WHERE {
?s xmlns:mbox_sha1sum ?hash.
?s xmlns:made ?o.
?s xmlns:name ?name.
?o ontoware:year "2009".
?r xmlns:mbox_sha1sum ?hash.
?r xmlns:made ?x.
?x ontoware:year "2008".
}
我需要将 ?o 和 ?x 合并到一个名为 ?papers 的列中 如果有帮助的话, ?s 和 ?r 有不同的 IRI
最佳答案
您可以通过组合分组和聚合来完成此操作,如下所示:
PREFIX xmlns: <http://xmlns.com/foaf/0.1/>
PREFIX ontoware: <http://swrc.ontoware.org/ontology#>
SELECT (SAMPLE(?name) AS ?GroupName) (GROUP_CONCAT(CONCAT(?x, ", ", ?o) ; SEPARATOR = ", ") AS ?Papers)
WHERE
{
?s xmlns:mbox_sha1sum ?hash.
?s xmlns:made ?o.
?s xmlns:name ?name.
?o ontoware:year "2009".
?r xmlns:mbox_sha1sum ?hash.
?r xmlns:made ?x.
?x ontoware:year "2008".
} GROUP BY ?hash
GROUP BY
子句通过 ?hash
变量将结果分组在一起,因为您仅按此变量分组,然后无法选择 ?name
直接(因为正如您所显示的,它有多个值),因此您必须使用 SAMPLE(?name)
来为您提供可能的名称之一(不保证您会得到哪个名称) )。
然后,您可以使用 GROUP_CONCAT()
聚合将给定表达式的所有值组合在一起。由于您实际上有两个需要组合的值,因此需要使用 CONCAT()
函数作为表达式。
请记住,这不会给您确切想要的东西,而是您会得到如下所示的内容:
?GroupName | ?Papers
--------------------------------
ABCD | xyz, ghh, xyz, him
消除重复的纸质条目是可能的,但可能会使您的查询变得更加复杂。通过在 Java 中后处理 ?Papers
值可能会更容易消除重复项。
关于sparql - 如何在sparql中合并两列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20341811/