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. 分析
如果你想了解查询是如何进行的,可以在查询语句之前加上EXPLAIN
或PROFILE
。
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/