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