unwind neo4j
当Neo4j 2.1发布时,我们将拥有UNWIND子句,该子句使处理事物集合变得更加容易。
在我的有关创建邻接矩阵的博客文章中,我们想要显示按字母顺序排列的前5个见面组中有多少人,然后检查其他各组中有多少人。
没有UNWIND子句,我们必须这样做:
MATCH (g:Group)
WITH g
ORDER BY g.name
LIMIT 5WITH COLLECT(id(g)) AS groupsMATCH (g1) WHERE id(g1) IN groups
MATCH (g2) WHERE id(g2) IN groupsOPTIONAL MATCH path = (g1)<-[:MEMBER_OF]-()-[:MEMBER_OF]->(g2)RETURN g1.name, g2.name, CASE WHEN path is null THEN 0 ELSE COUNT(path) END AS overlap
在这里,我们获得前5个组,将其ID放入集合中,然后通过背对背具有节点ID查找的MATCH来创建组的笛卡尔积。
如果不是在“组”中传递节点ID,而是传递节点,然后在MATCH步骤中使用节点ID,那么我们将进行完整的节点扫描,随着存储的增长,它变得非常慢。
例如,这个版本会很慢:
MATCH (g:Group)
WITH g
ORDER BY g.name
LIMIT 5WITH COLLECT(g) AS groupsMATCH (g1) WHERE g1 IN groups
MATCH (g2) WHERE g2 IN groupsOPTIONAL MATCH path = (g1)<-[:MEMBER_OF]-()-[:MEMBER_OF]->(g2)RETURN g1.name, g2.name, CASE WHEN path is null THEN 0 ELSE COUNT(path) END AS overlap
这是原始查询的输出:
+-------------------------------------------------------------------------------------------------------------+
| g1.name | g2.name | overlap |
+-------------------------------------------------------------------------------------------------------------+
| "Big Data Developers in London" | "Big Data / Data Science / Data Analytics Jobs" | 17 |
| "Big Data Jobs in London" | "Big Data London" | 190 |
| "Big Data London" | "Big Data Developers in London" | 244 |
| "Cassandra London" | "Big Data / Data Science / Data Analytics Jobs" | 16 |
| "Big Data Jobs in London" | "Big Data Developers in London" | 52 |
| "Cassandra London" | "Cassandra London" | 0 |
| "Big Data London" | "Big Data / Data Science / Data Analytics Jobs" | 36 |
| "Big Data London" | "Cassandra London" | 422 |
| "Big Data Jobs in London" | "Big Data Jobs in London" | 0 |
| "Big Data / Data Science / Data Analytics Jobs" | "Big Data / Data Science / Data Analytics Jobs" | 0 |
| "Big Data Jobs in London" | "Cassandra London" | 74 |
| "Big Data Developers in London" | "Big Data London" | 244 |
| "Cassandra London" | "Big Data Jobs in London" | 74 |
| "Cassandra London" | "Big Data London" | 422 |
| "Big Data / Data Science / Data Analytics Jobs" | "Big Data London" | 36 |
| "Big Data Jobs in London" | "Big Data / Data Science / Data Analytics Jobs" | 20 |
| "Big Data Developers in London" | "Big Data Jobs in London" | 52 |
| "Cassandra London" | "Big Data Developers in London" | 69 |
| "Big Data / Data Science / Data Analytics Jobs" | "Big Data Jobs in London" | 20 |
| "Big Data Developers in London" | "Big Data Developers in London" | 0 |
| "Big Data Developers in London" | "Cassandra London" | 69 |
| "Big Data / Data Science / Data Analytics Jobs" | "Big Data Developers in London" | 17 |
| "Big Data London" | "Big Data Jobs in London" | 190 |
| "Big Data / Data Science / Data Analytics Jobs" | "Cassandra London" | 16 |
| "Big Data London" | "Big Data London" | 0 |
+-------------------------------------------------------------------------------------------------------------+
25 rows
如果使用UNWIND,则不再需要传递节点ID,而是可以将节点收集到一个集合中,然后将其分解为笛卡尔积:
MATCH (g:Group)
WITH g
ORDER BY g.name
LIMIT 5WITH COLLECT(g) AS groupsUNWIND groups AS g1
UNWIND groups AS g2OPTIONAL MATCH path = (g1)<-[:MEMBER_OF]-()-[:MEMBER_OF]->(g2)RETURN g1.name, g2.name, CASE WHEN path is null THEN 0 ELSE COUNT(path) END AS overlap
没有明显更少的代码,但是我认为使用UNWIND可以使查询的意图更加清晰。
我很期待看到2.1是GA时UNWIND人员的创新用途。
翻译自: https://www.javacodegeeks.com/2014/06/neo4j-2-1-passing-around-node-ids-vs-unwind.html
unwind neo4j