Neo4j Cypher - 收集两个数组值返回一个对象

时间:2016-11-07 11:08:04

标签: arrays neo4j cypher

我有多个具有相同标签的节点。节点属性有两个数组。我想将两个数组值连接到对象或地图。

示例:

  • 数组一:[1,2,3,4,5]
  • 数组二:[5,4,3,2,1]

我想将结果作为{output:[{1,5},{2,4},{3,3},{4,2},{5,1}]}返回,因此该输出结果中总共有5个对象。

Cypher有可能吗?

3 个答案:

答案 0 :(得分:3)

APOC程序可能是继续这一过程的方法。在Collection Functions部分中,您需要的过程为apoc.coll.zip([list1],[list2])。它类似于你想要的,但不完全一样。它不会返回对象列表,而是返回列表对列表:

with [1,2,3,4,5] as list1, [5,4,3,2,1] as list2
call apoc.coll.zip(list1,list2) yield value
return {outputs:value}
// returns {outputs:[[1, 5], [2, 4], [3, 3], [4, 2], [5, 1]]}

关于所需的输出,Cypher中的对象就像JSON对象,由键/值对组成,因此无法以您描述的格式返回它。你可以自己测试一下。

// this works just fine
return {output: [[1,2]]}

// this causes a syntax error
return {output: [{1,2}]}

答案 1 :(得分:2)

WITH [1,2,3,4,5] AS array_one, [5,4,3,2,1] AS array_two
UNWIND RANGE(0, SIZE(array_one) - 1) AS i
WITH [array_one[i], array_two[i]] AS output
WITH COLLECT(output) AS output_list
RETURN {outputs: output_list}

这将为您提供一张地图,其唯一值是列表清单。如果您想要动态构建地图列表(您的问题的语法不明确),则必须查看apoc,Cypher本身不支持动态密钥分配。

答案 2 :(得分:0)

地图数组

您可以在不使用APOC的情况下生成包含地图数组的地图:

WITH [1,2,3,4,5] AS a1, [5,4,3,2,1] AS a2
RETURN {output: REDUCE(s = [], i IN RANGE(0, SIZE(a1)-1) | s + {one: a1[i], two: a2[i]})} AS res;

输出结果为:

{output:[{"one":1,"two":5},{"one":2,"two":4},{"one":3,"two":3},{"one":4,"two":2},{"one":5,"two":1}]}

数组数组

生成包含数组数组的地图:

WITH [1,2,3,4,5] AS a1, [5,4,3,2,1] AS a2
RETURN {output: REDUCE(s = [], i IN RANGE(0, SIZE(a1)-1) | s + [[a1[i], a2[i]]])} AS res;

输出结果为:

{output:[[1,5],[2,4],[3,3],[4,2],[5,1]]}