Cypher
介绍
Cypher
类似 SQL
语言,也保留了些 SQL
关键词比如 WHERE
、ORDER BY
等,而模式匹配则引入 SparQL
语法。
建立节点及构建关系
# 使用 CREATE 语句来创建节点并构建其间关联关系
CREATE (adam:User { name: 'Adam' }),(pernilla:User { name: 'Pernilla' }),(david:User { name: 'David' }), (adam)-[:FRIEND]->(pernilla),(pernilla)-[:FRIEND]->(david)
查询语句
Cypher
关键信息属性说明如下:
-
MATCH
表示图匹配模式,其中()
表示节点,{}
表示节点中的属性值,[]
表示关联关系->
表示关系方向-
表示有关联关系;其中WITH
可接聚合相关的数据内容 -
WHERE
表示字段数据匹配条件 -
RETURN
表示返回数据
因此,基础格式为 MATCH <图节点匹配逻辑> WHERE <节点数据匹配条件> RETURN <返回数据>
,例如匹配 John
二度朋友的列表:
# 匹配 john 节点 :friend 关系 的节点的 :friend 关系 的节点 fof
MATCH (john {name: 'John'})-[:friend]->()-[:friend]->(fof)
RETURN john.name, fof.name
# 过滤数据用户名称在指定范围内,且其名称符合 S.* 的数据列表
MATCH (user)-[:friend]->(follower)
WHERE user.name IN ['Joe', 'John', 'Sara', 'Maria', 'Steve'] AND follower.name =~ 'S.*'
RETURN user.name, follower.name
# 聚合名字为 John 的朋友数量,输出节点及其数量,带分页
MATCH (n {name: 'John'})-[:FRIEND]-(friend)
WITH n, count(friend) as friendsCount
WHERE friendsCount > 3
RETURN n, friendsCount
SKIP 10
LIMIT 20
更新数据
使用 SET
语句来更新节点数据
# 聚合名字为 John 的朋友数量,更新节点中 friendCount 值,并输出数量
MATCH (n {name: 'John'})-[:FRIEND]-(friend)
WITH n, count(friend) as friendsCount
SET n.friendCount = friendsCount
# RETURN 语句可以省略
RETURN n.friendsCount
Cypher
语句例子
# 导入 movies 数据
LOAD CSV WITH HEADERS FROM "http://neo4j.com/docs/2.3.0/csv/query-tuning/movies.csv" AS line
# 与现有数据进行合并,合并条件为 MERGE 之后的节点描述模板
MERGE (m:Movie { title:line.title })
# 匹配到上述 merge 条件之后,对相应的节点创建更新属性信息
ON CREATE SET m.released = toInt(line.released), m.tagline = line.tagline
# 导入 actors 数据
LOAD CSV WITH HEADERS FROM 'http://neo4j.com/docs/2.3.0/csv/query-tuning/actors.csv' AS line
MATCH (m:Movie { title:line.title })
MERGE (p:Person { name:line.name })
ON CREATE SET p.born = toInt(line.born)
MERGE (p)-[:ACTED_IN { roles:split(line.roles,";")}]->(m)
# 导入 directors 数据
LOAD CSV WITH HEADERS FROM 'http://neo4j.com/docs/2.3.0/csv/query-tuning/directors.csv' AS line
MATCH (m:Movie { title:line.title })
MERGE (p:Person { name:line.name })
ON CREATE SET p.born = toInt(line.born)
MERGE (p)-[:DIRECTED]->(m)
# 调试
PROFILE
MATCH (p:Person { name:"Tom Hanks" })
RETURN p
注
MERGE
与 SQL
中 UPDATE
类似,按条件更新节点数据,其后可接 ON CREATE SET
(创建属性) 和 ON MATCH SET
(更新属性),例如:
# 合并条件为 名为 Keanu Reeves 的 Person
MERGE (keanu:Person { name:'Keanu Reeves' })
ON CREATE SET keanu.created = timestamp()
ON MATCH SET keanu.lastSeen = timestamp()
RETURN keanu.name, keanu.created, keanu.lastSeen
删除数据
# 删除节点
MATCH (n:Useless)
DELETE n
# 删除关系
MATCH ()-[r:RELEASED]-()
DELETE r
# 删除节点及其关系
MATCH (n { name:'Andres' })
DETACH DELETE n
# 删除属性
MATCH (andres { name: 'Andres' })
REMOVE andres.age
RETURN andres
网友评论