创建新的关系
发布于 3 年前 作者 taosf 429 次浏览 来自 问答

遇到一个创建关系的问题,请教各位,感谢感谢!! 假设有100个“学生”节点,4个“大学”节点; 目前这100个学生已经分别于4个大学节点建立了关系,比如 20个学生属于“北大” ,20个学生属于“清华”, 30个学生属于“复旦”, 30个学生属于“交大”

目前想做的是: 为就读同一学校的学生,创建“校友”这个关系; 大致思路是,先遍历4个大学,找出和它们有关的学生,再给这些学生两两建立“校友”这个新的关系; 困难在于,不知道如何处理这种“遍历” 和“循环”的关系,可否有高手指点一二,谢谢

2 回复

给你个思路 match (n:学生)-[:在校]->(s:学校)<-[:在校]-(m:学生) where n<>m create (n)-[:校友]->(m) ,(n)<-[:校友]-(m)

@pangguoming 感谢回复。 你用的这个条件 where n<>m,蛮有意思的,昨天没有想到,谢谢。

昨天在发过帖子之后,立刻在系统了做了一个“粗暴”的尝试,反正是学习环境,没所谓。 直接使用如下语句来运行,也没有加限制条件,居然成功达到了我想要的效果 MATCH (n1:Stu)–(u:University)–(n2:Stu) merge (n1)-[line:Alumnus]-(n2) RETURN n2,n1

之前主要担心的 1)“清华”和“北大”的学生,是否会被错误的创建 “校友”关系 2)“清华”的学生,是否会创建多余的关系,即和自己建立关系,以及建立了双向的关系。 这两个问题,都没有发生,看来Neo4j的查询语句设计时候已经规避了这些问题,挺好 :)

另外,多说一句, create (n)-[:校友]->(m) ,(n)<-[:校友]-(m) 我看过一篇文章,对于这样双向互等的关系,创建的时候没有必要创建两条,只要在查询的时候不加方向即可;文章中简单的说了一下建立两个方向的弊端,请参考 https://blog.csdn.net/hwz2311245/article/details/54602706

多谢讨论!

回到顶部