You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:22:39