neo4j

Neo4j 的查询语言叫 Cypher,语法很像 “用英语描述关系”,特别直观。下面用社交网络场景举例,教你快速上手核心查询操作:

一、准备工作:先创建示例数据

假设我们有一个简单的社交网络,包含:

  • 节点:用户(Person)、兴趣(Interest)、城市(City)
  • 关系:FOLLOWS(关注)、LIKES(喜欢)、LIVES_IN(住在)

用 Cypher 语句创建数据:

cypher
 
 
// 创建用户节点
CREATE (alice:Person {name: "Alice", age: 30})
CREATE (bob:Person {name: "Bob", age: 25})
CREATE (charlie:Person {name: "Charlie", age: 35})

// 创建兴趣节点
CREATE (tech:Interest {name: "Technology"})
CREATE (sports:Interest {name: "Sports"})

// 创建城市节点
CREATE (beijing:City {name: "Beijing"})
CREATE (shanghai:City {name: "Shanghai"})

// 建立关系
CREATE (alice)-[:FOLLOWS]->(bob)
CREATE (bob)-[:FOLLOWS]->(charlie)
CREATE (alice)-[:LIKES]->(tech)
CREATE (bob)-[:LIKES]->(sports)
CREATE (alice)-[:LIVES_IN]->(beijing)
CREATE (bob)-[:LIVES_IN]->(shanghai)
CREATE (charlie)-[:LIVES_IN]->(shanghai)
 

二、基础查询:查节点、关系和属性

1. 查所有用户

cypher
 
 
MATCH (p:Person)
RETURN p
 

  • MATCH:告诉 Neo4j 你想 “匹配” 什么模式(比如节点、关系)
  • (p:Person):定义一个变量 p,代表类型为 Person 的节点
  • RETURN p:返回匹配到的节点

2. 查住在上海的用户

cypher
 
 
MATCH (p:Person)-[:LIVES_IN]->(c:City {name: "Shanghai"})
RETURN p.name, c.name
 

  • (p:Person)-[:LIVES_IN]->(c:City {...}):匹配 “用户→住在→上海” 的关系路径
  • RETURN p.name, c.name:只返回用户名字和城市名字

三、复杂查询:深挖关系网络

1. 查 Alice 的所有关注对象

cypher
 
 
MATCH (a:Person {name: "Alice"})-[:FOLLOWS]->(followed)
RETURN followed.name
 

  • (a:Person {...})-[:FOLLOWS]->(followed):匹配 “Alice→关注→某人” 的路径
  • 结果:Bob

2. 查 Alice 的 “二度人脉”(关注的人再关注的人)

cypher
 
 
MATCH (a:Person {name: "Alice"})-[:FOLLOWS]->(:Person)-[:FOLLOWS]->(second_degree)
WHERE a <> second_degree  // 排除 Alice 自己
RETURN second_degree.name
 

  • (a)-[:FOLLOWS]->(:Person)-[:FOLLOWS]->(second_degree):匹配两步关注关系
  • 结果:Charlie

3. 查共同兴趣的人

cypher
 
 
MATCH (p1:Person {name: "Alice"})-[:LIKES]->(interest)<-[:LIKES]-(p2:Person)
WHERE p1 <> p2  // 排除 Alice 自己
RETURN p2.name, interest.name
 

  • (p1)-[:LIKES]->(interest)<-[:LIKES]-(p2):匹配 “人→喜欢→兴趣←喜欢←人” 的路径
  • 结果:如果有其他人也喜欢 Technology,就会显示

四、聚合查询:统计和排序

1. 查每个城市的用户数量

cypher
 
 
MATCH (p:Person)-[:LIVES_IN]->(c:City)
RETURN c.name, COUNT(p) AS user_count
ORDER BY user_count DESC
 

  • COUNT(p):统计每个城市关联的用户数量
  • ORDER BY user_count DESC:按用户数量降序排列

2. 查谁的关注最多(粉丝数)

cypher
 
 
MATCH (p:Person)<-[:FOLLOWS]-()  // 匹配“被关注”的关系
RETURN p.name, COUNT(*) AS follower_count
ORDER BY follower_count DESC
 

  • <-[:FOLLOWS]-():匹配 “被任何人关注” 的路径

五、实战:医药场景怎么用?

假设我们有一个医药知识图谱,包含:

  • 节点:药品(Drug)、疾病(Disease)、副作用(SideEffect)
  • 关系:Treats(治疗)、Causes(导致)、Contraindication(禁忌)

1. 查治疗高血压的药物

cypher
 
 
MATCH (d:Drug)-[:Treats]->(dis:Disease {name: "Hypertension"})
RETURN d.name
 

2. 查 “阿司匹林” 的副作用

cypher
 
 
MATCH (aspirin:Drug {name: "Aspirin"})-[:Causes]->(se:SideEffect)
RETURN se.name
 

3. 查 “布洛芬” 和 “华法林” 的禁忌关系

cypher
 
 
MATCH (ibuprofen:Drug {name: "Ibuprofen"})-[:Contraindication]->(warfarin:Drug {name: "Warfarin"})
RETURN ibuprofen.name, warfarin.name
 

六、小技巧:可视化查询结果

在 Neo4j Browser 中执行查询后,你可以:

  • 点击结果中的节点,查看它的所有关系
  • 使用 LIMIT 限制返回数量,比如 RETURN p LIMIT 10
  • 使用 DISTINCT 去重,比如 RETURN DISTINCT p.name

如果想导出数据,可以用 CSV 格式:

cypher
 
 
MATCH (p:Person)
RETURN p.name, p.age
 

执行后,点击查询结果上方的 Download CSV 按钮。

总结:Cypher 查询的核心逻辑

  1. 用 MATCH 定义你想查找的 “关系模式”(比如 “人→关注→人”)
  2. 用括号 () 表示节点,冒号 : 指定节点类型(如 :Person
  3. 用方括号 [] 表示关系,箭头 -> 表示方向(如 [:FOLLOWS]->
  4. 用 RETURN 指定你想看到的结果(节点、属性或统计值)

Neo4j 的强大之处在于,它让你用 “描述关系” 的方式查询数据,就像你在大脑中想象人际关系网一样自然!
posted @ 2025-06-21 22:24  m516606428  阅读(14)  评论(0)    收藏  举报