unwind neo4j_Neo4j 2.1:传递节点ID与UNWIND

unwind neo4j

当Neo4j 2.1发布时,我们将拥有UNWIND子句,该子句使处理事物集合变得更加容易。

在我的有关创建邻接矩阵的博客文章中,我们想要显示按字母顺序排列的前5个见面组中有多少人,然后检查其他各组中有多少人。



没有UNWIND子句,我们必须这样做:

MATCH (g:Group)
WITH g
ORDER BY g.name
LIMIT 5
 
WITH COLLECT(id(g)) AS groups
 
MATCH (g1) WHERE id(g1) IN groups
MATCH (g2) WHERE id(g2) IN groups
 
OPTIONAL 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 5
 
WITH COLLECT(g) AS groups
 
MATCH (g1) WHERE g1 IN groups
MATCH (g2) WHERE g2 IN groups
 
OPTIONAL 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 5
 
WITH COLLECT(g) AS groups
 
UNWIND groups AS g1
UNWIND groups AS g2
 
OPTIONAL 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值