Cypher提供了一个方便的方法去表示查询和其他的neo4j行为,Cypher不仅可以完成工作,也可以在产品中有足够快的速度。也可以 基于java语言来处理查询用例,使用java API可以自定义遍历方法。
Cypher语言进行查询的步骤为:语法分析和验证查询,生成执行方案,定位初始节点,选择和遍历关系,改变或者返回结果。在图数据库中进行强力搜索是非常消耗时间的,最好有一初始节点,或者有相应的索引。
在图数据库中,有联系的节点以及联系所组成的模式(pattern)是最有价值的东西,提供了最多的信息。Cypher语言正是基于模式的语言,可以非常直观的表达模式。
Cypher基本语法
节点语法:(),(matrix),(:movie),(matrix:Movie{title:“the matix”,released:1997})
关系语法: -[role:ACTED_IN{roles:[“neo”]}]->
模式语法:(:people)-[:like]->(:people)
模式可以赋值给标示符:like=(:people)-[:like]->(:people)
在模式中使用的节点表示数据库中0到多个物理节点,关系代表数据库中的零到多个关系,模式表示0到多个路径。
Cypher子句
Create子句:创建新的节点,关系,模式
CREATE (a:Person { name:"Tom Hanks", born:1956 })-[r:ACTED_IN { roles: ["Forrest"]}]->(m:Movie { title:"Forrest Gump",released:1994 })
CREATE (d:Person { name:"Robert Zemeckis", born:1951 })-[:DIRECTED]->(m) RETURN a,d,r,m
Match子句:类似于查找
MATCH (p:Person { name:"Keanu Reeves" }) RETURN p
MATCH (p:Person { name:"Tom Hanks" })-[r:ACTED_IN]->(m:Movie)
RETURN m.title, r.roles
组合子句:
MATCH (p:Person { name:"Tom Hanks" })
CREATE (m:Movie { title:"Cloud Atlas",released:2012 })
CREATE (p)-[r:ACTED_IN { roles: [‘Zachry‘]}]->(m)
RETURN p,r,m
Merge子句:结合了create和match子句的功能,首先查找是否有符合模式的节点或者路径,如果没有符合模式条件的结果,则创建符合模式的节点或者路劲。同时提供了on create子句,可以在创建节点或者关系的情况下执行特定的操作。Merge子句
MERGE (m:Movie { title:"Cloud Atlas" })
ON CREATE SET m.released = 2012
RETURN m
MATCH (m:Movie { title:"Cloud Atlas" })
MATCH (p:Person { name:"Tom Hanks" })
MERGE (p)-[r:ACTED_IN]->(m)
ON CREATE SET r.roles =[‘Zachry‘]
RETURN p,r,m
获取想要的结果
过滤结果:where子句
MATCH (m:Movie)
WHERE m.title = "The Matrix"
RETURN m
//等价用法
MATCH (m:Movie { title: "The Matrix" })
RETURN m
//返回没有导演过电影的演员及其所演过的电影
MATCH (p:Person)-[:ACTED_IN]->(m)
WHERE NOT (p)-[:DIRECTED]->() //没有导演过电影的人才满足
RETURN p,m
在结果中使用表达式:组织返回的结果的形式
MATCH (p:Person)
RETURN p, p.name AS name, upper(p.name), coalesce(p.nickname,"n/a") AS nickname, { name: p.name, label:head(labels(p))} AS person
聚合数据:对返回的结果进行统计
//统计演员和导演合作的次数
MATCH (actor:Person)-[:ACTED_IN]->(movie:Movie)<-[:DIRECTED]-(director:Person)
RETURN actor,director,count(*) AS collaborations
排序
MATCH (a:Person)-[:ACTED_IN]->(m:Movie)
RETURN a,count(*) AS appearances
ORDER BY appearances DESC LIMIT 10;
混合子句:union
MATCH (p:Person)-[r:ACTED_IN]->(m:Movie) RETURN p,type(r) AS rel,m
UNION
MATCH (p:Person)-[r:DIRECTED]->(m:Movie) RETURN p,type(r) AS rel,m
标签,约束和索引
标签在图数据库中可以用来组织节点。它们也被用来限定查询,定义约束和建立索引。
CREATE CONSTRAINT ON (movie:Movie) ASSERT movie.title IS UNIQUE