如何在sparql中组合两列?

时间:2013-12-03 02:37:03

标签: sparql jena protege gruff

嗨我有这样的结果输出:

?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

1 个答案:

答案 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值来消除重复项可能更容易。