Neo4j中如何查询节点的出入KNOWS关系及关系属性?
正确的Cypher查询语句获取双向KNOWS关系
没问题,我来帮你搞定这个查询需求!你之前的语句只返回了出边,是因为->明确指定了从a指向其他节点的关系方向,而b指向a的入边就被漏掉了。要同时获取双向的KNOWS关系,有两种常用的写法:
方法1:使用无方向关系匹配
这种写法最简洁,直接用无方向的关系语法-[r:KNOWS]-,会自动匹配所有和a相连的KNOWS关系(不管是入还是出):
MATCH (n:person{name:'a'})-[r:KNOWS]-(p:person) RETURN p.name AS related_person, r.from AS relationship_start_year, r.month AS relationship_start_month, CASE WHEN (n)-[r]->(p) THEN 'outgoing' ELSE 'incoming' END AS relationship_direction
说明:
- 给关系起变量
r,就能提取它的from和month属性 - 通过
CASE语句可以清晰区分当前关系是a指向他人(outgoing)还是他人指向a(incoming) - 最终会返回所有和a有双向KNOWS关系的节点(包括b到a的入边记录)
方法2:明确匹配入边和出边
如果你想更直观地指定两种方向的关系,可以用OR组合两个匹配条件:
MATCH (n:person{name:'a'})-[r:KNOWS]->(p:person) OR (n:person{name:'a'})<-[r:KNOWS]-(p:person) RETURN p.name AS related_person, r.from AS relationship_start_year, r.month AS relationship_start_month, CASE WHEN (n)-[r]->(p) THEN 'outgoing' ELSE 'incoming' END AS relationship_direction
这种写法和方法1的结果完全一致,但更明确地展示了要匹配的两种关系方向,适合需要强调逻辑分支的场景。
为什么之前的查询不行?
你之前的语句MATCH (n:person{name:'a'})-[:KNOWS]->(person)里的->是有方向的关系运算符,它只匹配从n(a)指向person的出边,所以b到a的入边不会被包含进来,自然只能返回b和c的出边记录。
内容的提问来源于stack exchange,提问作者Krischal Mahat
相关产品推荐
相关产品推荐

