Cypher 中的字符串聚合
string aggregation in Cypher
我需要 Cypher 中的 Postgres string_agg
、Oracle listagg
或 MySQL group_concat
的等价物。我的 Cypher 查询是一个返回字符串流的存储过程(在下面的最小化示例中被 collection unwind 替换)。因此,我想获得所有字符串串联的单个字符串。
示例:
UNWIND ['first','second','third'] as c
RETURN collect(c)
实际结果(列表类型):
["first", "second", "third"]
预期结果(字符串类型):
"firstsecondthird"
或(最好有):
"firstCUSTOMSEPARATORsecondCUSTOMSEPARATORthird"
(我只是想快速构建临时查询来验证 Neo4j 消费者实际执行的一些后处理,我认为这很简单,但我找不到任何解决方案。与 不同,我想要字符串,而不是集合,因为我的问题与连接字符串的长度有关。)
使用 APOC 怎么样?
UNWIND ['first','second','third'] as c
RETURN apoc.text.join(collect(c), '-') AS concat
其中 -
是您的自定义分隔符。
结果:
╒════════════════════╕
│"concat" │
╞════════════════════╡
│"first-second-third"│
└────────────────────┘
--
无 APOC
当集合只有一个元素时考虑
UNWIND ['first','second','third'] as c
WITH collect(c) AS elts
RETURN CASE WHEN size(elts) > 1
THEN elts[0] + reduce(x = '', z IN tail(elts) | x + '-' + z)
ELSE elts[0]
END
您可以进一步简化查询如下。如果列表为空,则无需担心,如果 l 为空列表
,它将 return null
WITH ['first','second','third'] as l
RETURN REDUCE(s = HEAD(l), n IN TAIL(l) | s + n) AS result
我需要 Cypher 中的 Postgres string_agg
、Oracle listagg
或 MySQL group_concat
的等价物。我的 Cypher 查询是一个返回字符串流的存储过程(在下面的最小化示例中被 collection unwind 替换)。因此,我想获得所有字符串串联的单个字符串。
示例:
UNWIND ['first','second','third'] as c
RETURN collect(c)
实际结果(列表类型):
["first", "second", "third"]
预期结果(字符串类型):
"firstsecondthird"
或(最好有):
"firstCUSTOMSEPARATORsecondCUSTOMSEPARATORthird"
(我只是想快速构建临时查询来验证 Neo4j 消费者实际执行的一些后处理,我认为这很简单,但我找不到任何解决方案。与
使用 APOC 怎么样?
UNWIND ['first','second','third'] as c
RETURN apoc.text.join(collect(c), '-') AS concat
其中 -
是您的自定义分隔符。
结果:
╒════════════════════╕
│"concat" │
╞════════════════════╡
│"first-second-third"│
└────────────────────┘
--
无 APOC
当集合只有一个元素时考虑
UNWIND ['first','second','third'] as c
WITH collect(c) AS elts
RETURN CASE WHEN size(elts) > 1
THEN elts[0] + reduce(x = '', z IN tail(elts) | x + '-' + z)
ELSE elts[0]
END
您可以进一步简化查询如下。如果列表为空,则无需担心,如果 l 为空列表
,它将 return nullWITH ['first','second','third'] as l
RETURN REDUCE(s = HEAD(l), n IN TAIL(l) | s + n) AS result