Nosql-图数据库-什么是Cypher语言

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.name

Neo4j 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.friendsCount

Returning 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

本文使用 文章同步助手 同步

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容