Sparql将列表组合成1行的结果

时间:2016-04-11 19:30:03

标签: sparql

我看过GROUP_CONCAT,但它并没有按我的意愿行事。

假设我有这些数据:

_:autos325 rdf:first "john";
           rdf:rest _:autos326.
_:autos326 rdf:first "d";
           rdf:rest _:autos327.
_:autos327 rdf:first "rockefeller";
           rdf:rest rdf:nil.
<http://foo.com/ABC> <http://prop/name> _:autos325

如果我使用此SPARQL读回名称:

SELECT  *  WHERE { <http://foo.com/ABC> <http://prop/name> ?o .
                    ?o rdf:rest*/rdf:first ?foo . }

我得到了名称,但名称的每个部分都作为结果中的单独行给出

如果我使用GROUP_CONCAT,它将一直有效,直到您使用变量作为主题。我无法忽略?s中的GROUP BY或我收到语法错误

select ?s  (group_concat(distinct ?foo;separator=", ") as ?names)
WHERE { ?s <http://prop/name> ?o .
                        ?o rdf:rest*/rdf:first ?foo . }
GROUP BY ?s ?foo

如何连接?foo结果,以便将整个名称填充到一行而不是分布在三个结果行中?

2 个答案:

答案 0 :(得分:2)

问题在于您正在?foo进行分组。将其更改为:

GROUP BY ?s

它应该有用。

聚合运算符(例如COUNTGROUP_CONCAT等)始终在 groups 解决方案上运行。这些组由GROUP BY子句定义(如果不存在,则整个解决方案计为一个大组)。所以让GROUP BY ?s基本上说:“将{{1>} 的每个值的名称连接起来”。但是,如果您还要?s添加?foo,您实际上会说:“GROUP BY?s 的每个值组合连接名称 ”。这当然会再次为?foo的每个值生成一个单独的行,实际上没有任何内容会被连接起来。

答案 1 :(得分:0)

我用简单的案例修复了它,但没有使用复杂的查询,因为我必须在GROUP BY中开始包含其他变量。正确的方法是GROUP BY主题然后使用GROUP_CONCAT

是的,我是SPARQL的新手: - )

SELECT ?s  (GROUP_CONCAT(DISTINCT ?foo;separator=", ") AS ?names)
WHERE { ?s <http://prop/name> ?o .
        ?o rdf:rest*/rdf:first ?foo . }
GROUP BY ?s