在Neo4j cypher查询中递增一个值

时间:2016-03-18 18:35:09

标签: neo4j cypher

用户正在向我传递一个UUID数组,该数组引用我数据库中的节点。我想将她的USER节点与其他每个节点相关联。面临的挑战是,我想知道UUID给我的顺序。

所以如果UUID是:[AAA,CCC,BBB],我想执行类似的事情:

(user)-[:REL {order: 1}]->(:THING {name:"AAA"})
(user)-[:REL {order: 2}]->(:THING {name:"CCC"})
(user)-[:REL {order: 3}]->(:THING {name:"BBB"})

当然,我不想在多个陈述中这样做。我想将该列表作为参数传递。

MATCH(u:USER {id:{id}})
MATCH(t:THING) where t.name in {that_list}
CREATE (u)-[:REL {order: ???}]->(t)

请注意???。这是关键。

如何实现这一目标?我让它使用循环传递测试,但我觉得我应该能够做到这一点。

1 个答案:

答案 0 :(得分:1)

这可能对您有用:

MATCH(u:USER {id:{id}})
UNWIND {that_list} AS name
MATCH(t:THING) WHERE t.name = name
WITH u, COLLECT(t) AS things
FOREACH(i IN RANGE(0, SIZE(things)-1) |
  FOREACH(x IN [things[i]] | CREATE (u)-[:REL {order: i}]->(x)));

UNWIND使列表中的每个项目都以相同的顺序在单独的数据行中提供。

内部FOREACH只是在单个节点上“迭代”。使用此技巧是因为CREATE模式不能使用节点的表达式。因此,这个逻辑等效的条款不合法:FOREACH(i IN RANGE(0, SIZE(things)-1) | CREATE (u)-[:REL {order: i}]->(things[i]))