在 Neo4j 中对子数组进行排序

Sorting sub-arrays in Neo4j

我需要从一组数组中删除所有重复项,但我们在这里以一种特殊的方式定义 'duplicate':两个 4 元素数组是 'dupes' 如果它们共享任何中的前两个元素顺序和任意顺序的最后两个元素。 所以我的想法是将这些数组分成两半,对那些 2 元素的半数组进行排序,然后将它们重新组合在一起以形成 4 元素数组。然后我们将有一些我们可以删除的教科书副本。

这是一个好方法吗?
我们从一组 6 个 4 元素数组开始,none 其中与另一个完全相同。

[6, 4, 3, 2]
[4, 6, 2, 3]
[3, 4, 2, 6]
[4, 3, 6, 2]
[3, 6, 2, 4]
[6, 3, 4, 2]

在中间拆分每个数组

[[6, 4], [3, 2]] 
[[4, 6], [2, 3]]
[[3, 4], [2, 6]]
[[4, 3], [6, 2]]
[[3, 6], [2, 4]]
[[6, 3], [4, 2]]

这是 Neo4j 中的难点! 仅对两个内部数组中的每一个进行排序。

[[4, 6], [2, 3]]
[[4, 6], [2, 3]]
[[3, 4], [2, 6]]
[[3, 4], [2, 6]]
[[3, 6], [2, 4]]
[[3, 6], [2, 4]]

把它们放回原处。

[4, 6, 2, 3]
[4, 6, 2, 3]
[3, 4, 2, 6]
[3, 4, 2, 6]
[3, 6, 2, 4]
[3, 6, 2, 4]

使用 DISTINCT 进行重复数据删除。

[4, 6, 2, 3]
[3, 4, 2, 6]
[3, 6, 2, 4]

这个非常简单的查询(使用您的样本数据)实现了您的方法,这似乎是合理的:

WITH [
  [6, 4, 3, 2],
  [4, 6, 2, 3],
  [3, 4, 2, 6],
  [4, 3, 6, 2],
  [3, 6, 2, 4],
  [6, 3, 4, 2]
] AS data
UNWIND data AS d
RETURN DISTINCT
  CASE WHEN d[0] > d[1] THEN [d[1], d[0]] ELSE d[0..2] END +
  CASE WHEN d[2] > d[3] THEN [d[3], d[2]] ELSE d[2..] END AS res;

结果是:

+-----------+
| res       |
+-----------+
| [4,6,2,3] |
| [3,4,2,6] |
| [3,6,2,4] |
+-----------+

处理任何(偶数)大小的数组:

以下查询将接受大小为偶数(不必为 4)的子集合的集合作为输入。它将 return 内部正确地 "sorted" 个不同的集合。

例如(注意子集合的大小不必相同):

WITH [
  [6, 4, 3, 2, 3, 2],
  [3, 4, 2, 6, 7, 8],
  [4, 3, 6, 2, 8, 7],
  [3, 6, 2, 4],
  [6, 3, 4, 2],
  [4, 6, 2, 3, 2, 3]
] AS data
WITH EXTRACT(d IN data |
  REDUCE(s = [], i IN RANGE(0, SIZE(d)-1, 2) | s + CASE WHEN d[i] > d[i+1] THEN [d[i+1], d[i]] ELSE d[i..i+2] END)) AS sorted
UNWIND sorted AS res
RETURN DISTINCT res;

上面的输出是:

+---------------+
| res           |
+---------------+
| [4,6,2,3,2,3] |
| [3,4,2,6,7,8] |
| [3,6,2,4]     |
+---------------+