2

嗨,我有这样的结果输出:

?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

4

1 回答 1

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

消除重复的论文条目是可能的,但可能会使您的查询更加复杂。?Papers通过在 Java 中对值进行后处理,可能更容易消除重复项。

于 2013-12-03T09:11:04.033 回答