嗨我有这样的结果输出:
?name ?o ?x
------------
ABCD xyz ghh
PQR xyz hij
如何将列?o和?x组合成一个名为paper的列? 我需要输出如下:
?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组合成一个名为?paper的列 如果它有帮助,?s和?r有不同的IRI
答案 0 :(得分:2)
您可以使用分组和聚合的组合来完成此操作:
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
值来消除重复项可能更容易。