我看过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
结果,以便将整个名称填充到一行而不是分布在三个结果行中?
答案 0 :(得分:2)
问题在于您正在?foo
进行分组。将其更改为:
GROUP BY ?s
它应该有用。
聚合运算符(例如COUNT
,GROUP_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