在Neo4j中使用Cypher从数组中删除连续的重复项

译者言:本文演示了如何删除数组中的连续重复项,同时顺道介绍了apoc.coll.toSet函数的使用。

本周,我将和大家分享一个如何用Cypher查询语言从数组中删除连续重复项的技巧。

为了简单起见,假设我们有如下数组:

neo4j> return [1,2,3,3,4,4,4,5,3] AS values;
+-----------------------------+
| values |
+-----------------------------+
| [1, 2, 3, 3, 4, 4, 4, 5, 3] |
+-----------------------------+

我希望删除重复的3和4,得到如下结果:

[1,2,3,4,5,3]

APOC库中的apoc.coll.toSet也能从数组中删除重复项,但它的删除是不理会重复项出现的位置,其执行的结果是这下面这样:

neo4j> return apoc.coll.toSet([1,2,3,3,4,4,4,5,3]) AS values;
+-----------------+
| values |
+-----------------+
| [1, 2, 3, 4, 5] |
+-----------------+

这并不是我想要的,所以apoc.coll.toSet并不能完成我的要求。很幸运的是,我看到了Ulf Aslak写的一行python代码就可以完成删除数组中连续重复项,python代码如下:

values = [1,2,3,3,4,4,4,5,3]

>>> [v for i, v in enumerate(values) if i == 0 or v != values[i-1]]
[1, 2, 3, 4, 5, 3]

在Cypher查询语句中,可以使用range函数来完成遍历数组的功能,下面代码演示是如何做到这点的:

neo4j> WITH [1,2,3,3,4,4,4,5,3] AS values
RETURN [i in range(0, size(values)-1)
WHERE i=0 OR values[i] <> values[i-1] | values[i] ] AS values;
+--------------------+
| values |
+--------------------+
| [1, 2, 3, 4, 5, 3] |
+--------------------+

上面的数组中可以包含的是节点、字符串或者任意其他值,我使用数字仅仅是为了演示简单。

译者言: 此文相当简单实用,欢迎各位关注交流。

原文链接:https://markhneedham.com/blog/2019/01/12/neo4j-cypher-remove-consecutive-duplicates/


你可能感兴趣的:(在Neo4j中使用Cypher从数组中删除连续的重复项)