我有多个具有相同标签的节点。节点属性有两个数组。我想将两个数组值连接到对象或地图。
示例:
[1,2,3,4,5]
[5,4,3,2,1]
我想将结果作为{output:[{1,5},{2,4},{3,3},{4,2},{5,1}]}
返回,因此该输出结果中总共有5个对象。
Cypher有可能吗?
答案 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]]}