neo4j set 多个值
在Neo4j的密码查询语言中,我最喜欢的功能之一是COLLECT,它使我们能够将项目分组到一个数组中以备后用。
但是,我注意到人们有时难以确定如何使用COLLECT收集多个项目,并且很难找到一种方法。
考虑以下数据集:
create (p:Person {name: "Mark"})
create (e1:Event {name: "Event1", timestamp: 1234})
create (e2:Event {name: "Event2", timestamp: 4567})create (p)-[:EVENT]->(e1)
create (p)-[:EVENT]->(e2)
如果我们想返回每个人以及他们参加的活动名称的集合,我们可以编写以下内容:
$ MATCH (p:Person)-[:EVENT]->(e)
> RETURN p, COLLECT(e.name);
+--------------------------------------------+
| p | COLLECT(e.name) |
+--------------------------------------------+
| Node[0]{name:"Mark"} | ["Event1","Event2"] |
+--------------------------------------------+
1 row
效果很好,但是如果我们要收集事件名称和时间戳,但又不想返回整个事件节点,该怎么办?
我见过一些人在研讨会上尝试过的方法如下:
MATCH (p:Person)-[:EVENT]->(e)
RETURN p, COLLECT(e.name, e.timestamp)
不幸的是,这不能编译:
SyntaxException: Too many parameters for function 'collect' (line 2, column 11)
"RETURN p, COLLECT(e.name, e.timestamp)"^
正如错误消息所暗示的那样,COLLECT函数仅接受一个参数,因此我们需要寻找另一种解决问题的方法。
一种方法是将两个值放入文字数组中,这将导致将数组作为返回结果:
$ MATCH (p:Person)-[:EVENT]->(e)
> RETURN p, COLLECT([e.name, e.timestamp]);
+----------------------------------------------------------+
| p | COLLECT([e.name, e.timestamp]) |
+----------------------------------------------------------+
| Node[0]{name:"Mark"} | [["Event1",1234],["Event2",4567]] |
+----------------------------------------------------------+
1 row
这种方法的烦人之处在于,当您添加更多项目时,您会忘记将每条数据放在哪个位置,因此,我认为一种更好的方法是收集项目图:
$ MATCH (p:Person)-[:EVENT]->(e)
> RETURN p, COLLECT({eventName: e.name, eventTimestamp: e.timestamp});
+--------------------------------------------------------------------------------------------------------------------------+
| p | COLLECT({eventName: e.name, eventTimestamp: e.timestamp}) |
+--------------------------------------------------------------------------------------------------------------------------+
| Node[0]{name:"Mark"} | [{eventName -> "Event1", eventTimestamp -> 1234},{eventName -> "Event2", eventTimestamp -> 4567}] |
+--------------------------------------------------------------------------------------------------------------------------+
1 row
在本周早些时候运行的Clojure Neo4j Hackathon中 ,这被证明是一种特别令人愉悦的方法,因为我们可以轻松地在Clojure代码中破坏地图集合。
翻译自: https://www.javacodegeeks.com/2014/10/neo4j-collecting-multiple-values.html
neo4j set 多个值