Neo4j – Cypher基础

1. 创建一个节点

CREATE (ee:Person { name: "Emil", from: "Sweden", klout: 99 })
  • CREATE 创建数据
  • () 表示节点
  • ee:Person,ee是变量名,Person是label名称
  • {} 是节点属性

2. 查找一个节点

MATCH (ee:Person) WHERE ee.name = "Emil" RETURN ee;
  • MATCH指定一个节点或关系的模式
  • (ee:Person) 单一节点,Person为label,把值给变量ee
  • WHERE 来限制结果
  • ee.name = "Emil" 比较 name 的值和 “Emil”
  • RETURN 用于返回特定的结果

3. 创建多个节点和关系

MATCH (ee:Person) WHERE ee.name = "Emil"
CREATE (js:Person { name: "Johan", from: "Sweden", learn: "surfing" }),
(ir:Person { name: "Ian", from: "England", title: "author" }),
(rvb:Person { name: "Rik", from: "Belgium", pet: "Orval" }),
(ally:Person { name: "Allison", from: "California", hobby: "surfing" }),
(ee)-[:KNOWS {since: 2001}]->(js),(ee)-[:KNOWS {rating: 5}]->(ir),
(js)-[:KNOWS]->(ir),(js)-[:KNOWS]->(rvb),
(ir)-[:KNOWS]->(js),(ir)-[:KNOWS]->(ally),
(rvb)-[:KNOWS]->(ally)

在同一个上下文中,变量名(如ee,js)用于关系中节点的引用,其中ee是通过MATCH获得的node,js是新创建的node。

CREATE (节点1), (节点2), (节点3), (节点4), 
             (节点1)-[关系1]->(节点2),
             (节点2)-[关系2]->(节点3),
             ......

4. 模式匹配

模式匹配用于描述要在图中寻找的内容

MATCH (ee:Person)-[:KNOWS]-(friends)
WHERE ee.name = "Emil" RETURN ee, friends
  • MATCH 语句描述了已知节点到待找节点的关系模式
  • (ee) 模式始于Person (由 WHERE 提供)
  • -[:KNOWS]- 匹配 “KNOWS” 关系 (任意方向)
  • (friends) 会和 Emil 的 friends 绑定

5. 推荐

模式匹配能用来推荐,Johan正在学冲浪,他想找一个会冲浪的新朋友。

MATCH (js:Person)-[:KNOWS]-()-[:KNOWS]-(surfer)
WHERE js.name = "Johan" AND surfer.hobby = "surfing"
RETURN DISTINCT surfer
  • () 空括号忽略这些节点
  • DISTINCT 因为有多于一条的路径符合模式
  • surfer 包含了 Allison, 朋友的朋友而且会冲浪

6. 分析

如果你想了解查询是如何进行的,可以在查询语句之前加上EXPLAINPROFILE

PROFILE MATCH (js:Person)-[:KNOWS]-()-[:KNOWS]-(surfer)
WHERE js.name = "Johan" AND surfer.hobby = "surfing"
RETURN DISTINCT surfer

Refs

本文来自 Neo4j 的 :play cypher,是cypher这款图查询语言的入门教程。
更多Cypher的内容可以参考 http://neo4j.com/docs/cypher-refcard/3.0/

Leave a Reply

Your email address will not be published. Required fields are marked *