使用Cypher的FOREACH创建同邮编用户间LIVESINSAMEAREAAS关系的问题
解决用户间共同邮编关系创建的问题
首先得说你的原语句问题出在哪:
- 你用
a.pincode=b.pincode是要求两个用户的邮编数组完全相同,但你要的是只要有共同邮编就行,这个条件直接不符合需求; - 后面的FOREACH逻辑也有问题,循环里的
a和b根本没用到循环的变量pincode,结果就是不管收集了多少组,都会重复创建同一组节点的关系,自然得不到想要的结果。
下面给你两个可行的Cypher语句,都能实现你的需求:
方法一:用INTERSECTION函数判断共同元素
MATCH (a:User), (b:User) WHERE a <> b // 避免节点和自身创建关系 AND SIZE(INTERSECTION(a.pincode, b.pincode)) > 0 // 检查两个邮编数组有共同元素 AND NOT EXISTS((a)-[:LIVESINSAMEAREAAS]->(b)) // 防止重复创建相同关系 CREATE (a)-[:LIVESINSAMEAREAAS]->(b)
方法二:用ANY函数遍历检查
MATCH (a:User), (b:User) WHERE a <> b AND ANY(pin IN a.pincode WHERE pin IN b.pincode) // 检查a的任意邮编存在于b的邮编中 AND NOT EXISTS((a)-[:LIVESINSAMEAREAAS]->(b)) CREATE (a)-[:LIVESINSAMEAREAAS]->(b)
语句说明:
a <> b:必须加上这个条件,不然每个用户都会和自己创建关系,这显然不是你想要的;- 两个判断共同邮编的方式效果一致,选哪个都可以,INTERSECTION更直观体现“有共同元素”,ANY则是遍历检查;
NOT EXISTS(...):这个是为了防止多次运行语句时重复创建相同的关系,保证你的图数据不会冗余。
用上面的语句,就能正确在A和B(共同邮编111)、B和C(共同邮编333)之间创建LIVESINSAMEAREAAS关系,同时A和D因为邮编完全相同,也会创建关系,这符合你的数据逻辑。
内容的提问来源于stack exchange,提问作者user2720919
相关产品推荐
相关产品推荐

