What is Cypher

CREATE (john:Person {name: 'John'})CREATE (joe:Person {name: 'Joe'})CREATE (steve:Person {name: 'Steve'})CREATE (sara:Person {name: 'Sara'})CREATE (maria:Person {name: 'Maria'})CREATE (john)-[:FRIEND]->(joe)-[:FRIEND]->(steve)CREATE (john)-[:FRIEND]->(sara)-[:FRIEND]->(maria)MATCH (john {name: 'John'})-[:FRIEND]->()-[:FRIEND]->(fof)RETURN john.name, fof.name+----------------------+| john.name | fof.name |+----------------------+| "John" | "Maria" || "John" | "Steve" |+----------------------+2 rowMATCH (user)-[:FRIEND]->(follower)WHERE user.name IN ['Joe', 'John', 'Sara', 'Maria', 'Steve'] AND follower.name =~ 'S.*'RETURN user.name, follower.nameNeo4j databases and graphs
- DBMS:处理管理多个graph和database
- Graph:database中的一个data model,正常情况下,每一个database只有一个graph
- Database:存储检索数据
The system database and the default database
- neo4j server内部包含一个称为
system数据库,用于存储系统数据
新安装的neo4j包含两个数据库:
- system - the system database described above, containing meta-data on the DBMS and security configuration.
- neo4j - the default database, named using the config option dbms.default_database=neo4j.
Querying, updating and administering
查询管理graph
The structure of administrative queries
- 管理query不能和其他读写query结合在一起
- 每一个管理query,要么从system读取状态,要么向system进行更新动作
The structure of update queries
- Cypher query要么读match图,要么更新图,两个不是同时发生的
- 当要读图然后更新图时候,这个query将隐式的分成两个部分,read和write
- 当读图时,Cypher不会match,直到你需要返回结果时候
- 当update query,所有的读将会在写之前完成
- 当需要read graph再write graph时候,可以使用
WITH显示分离读写两个部分
MATCH (n {name: 'John'})-[:FRIEND]-(friend)WITH n, count(friend) AS friendsCount WHERE friendsCount > 3RETURN n, friendsCountMATCH (n {name: 'John'})-[:FRIEND]-(friend)WITH n, count(friend) AS friendsCountSET n.friendsCount = friendsCountRETURN n.friendsCountReturning data
- read query必须返回才可以,否则视为无效query
- update query不需要返回结果
- RETURN 表明整个语句的结束
Transactions
Transactions事务
- 所有的Cypher语句都是显示运行一个transation
- 对于只读的query,这个事务肯定会成功执行
- 对于update,这个事务不一定能执行成功,例如如果一个query尝试违背约束,则这个事务就会回滚;并且不改变这个graph;
- 每一个语句都是在一个事务内执行,直到成功执行,才会把结果更新到磁盘
- 不可能在一个事务外执行query,但是可以在一个事务内执行多个query
DBMS Transactions
- DBMS事务是database事务的容器
- 指定database的query将触发一个database事务
- database事务将随着DBMS事务的提交和回滚
- DBMS事务有下面的限制:
- 在DBMS事务中只有一个database能写
- Cypher操作将会分解到下面主要类别:
- 在graph上操作
- 模式命令 Schema commands
- Administration commands
Cypher Result Uniqueness
- 在模式匹配时候,Cypher会确保在同一个路径匹配中不会多次匹配相同的图关系,这称为
relationship isomorphism,能够更高效的减少结果集和避免无限的遍历; -
homomorphism同态:无唯一性检测 -
node isomoprphism同构:相同的node最多返回一次 -
relationship isomorphism:相同的关系最多返回一次
Cypher使用relationship isomorphism,
例子:
CREATE (adam:User { name: 'Adam' }),(pernilla:User { name: 'Pernilla' }),(david:User { name: 'David'}), (adam)-[:FRIEND]->(pernilla),(pernilla)-[:FRIEND]->(david)- 查找
Adam朋友的朋友
MATCH (user:User { name: 'Adam' })-[r1:FRIEND]-()-[r2:FRIEND]-(friend_of_a_friend)RETURN friend_of_a_friend.name AS fofName+---------+| fofName |+---------+| "David" |+---------+1 row# 这里Cypher确保r1和r2,不指向相同的关系但是,当你要返回user时候,结果很可能不是你想要的。当在使用多个MATCH的时候,很可能发生,
MATCH (user:User { name: 'Adam' })-[r1:FRIEND]-(friend)MATCH (friend)-[r2:FRIEND]-(friend_of_a_friend)RETURN friend_of_a_friend.name AS fofName+---------+| fofName |+---------+| "David" || "Adam" |+---------+2 rows下面这个query和第一个结果一样
这里MATCH使用一个简单的pattern匹配两个路径,而之前的使用两个不同的parttern
MATCH (user:User { name: 'Adam' })-[r1:FRIEND]-(friend), (friend)-[r2:FRIEND]-(friend_of_a_friend)RETURN friend_of_a_friend.name AS fofName+---------+| fofName |+---------+| "David" |+---------+1 row本文使用 文章同步助手 同步