图数据库的笔记之
最大优势:查询的高性能 举例说明: RDBMS-MySQL VS. Graph DB-Neo4j 在关系型数据库中的社交网络关系数据存储
查询某个用户的朋友的朋友:使用一次inner join操作 比如查询2的朋友的朋友:
select * from t_user_friend uf1 inner join t_user_friend uf2 on uf1.user_1 = uf2.user_2 where uf1.user_2 = 2;一般要做去重操作。可以得知2的朋友1的朋友是4。 如果要查询某个用户的朋友的朋友的朋友,即3度关系
select distinct * from t_user_friend uf1 inner join t_user_friend uf2 on uf1.user_1 = uf2.user_2 inner join t_user_friend uf3 on uf2.user_1 = uf3.user_2 where uf1.user_2 = 2;也就是说,在大量复杂的数据条件下,想要查询更深的关系,必须要使用更多的join操作,而大量的 join操作严重影响关系型数据库的性能。
图数据库正好擅长多对多的关系,不用表,列,外键,直接将用户存储为结点,以用户之间的关系来 组织这些结点,查询的时候直接使用图遍历的算法,非常高效。
下载地址: https://neo4j.com/download/community-edition/
个人通常使用社区版,安装Neo4j前必须要安装java虚拟机,Neo4j安装有两种方式: - 压缩版安装(.tar,.zip) - 安装版安装(dmg,exe)推荐
Neo4j支持本地访问和远程访问: - 远程连接有三种方式: - Bolt连接方式 - HTTP连接方式 - HTTPS连接方式( HTTPS需要有安全证书支持,让数据库开放在外网中访问时使用)
使用时修改配置文件neo4j.conf,网上有教程,官网上也有。 安装后启动服务器,然后我们就可以通过Web控制台来访问服务器了。 http://localhost:7474 http://服务器IP:7474 快速体验:在Web控制台中使用Cypher查询语言进行体验
关系型数据库拥有SQL查询语言, Structured Query Language。 Neo4j拥有CQL,即Cypher Query Language,关键字借鉴了SQL,SPARQL和python等语言。
Cypher可以在哪些地方使用? - neo4j-shell - Web控制台 - Neo4j API - Rest API
Cypher语法包括哪些内容? - 读写 - 索引 - 约束 - 标签 - 只读查询 - case子句 - 遍历路径 - 函数 - CALL调用存储过程
https://neo4j.com/docs/cypher-refcard/current/ https://neo4j.com/docs/developer-manual/3.2/cypher/
Neo4j的两种使用方式:嵌入式模式,服务器模式 - 嵌入式模式: - 只需要引用Neo4j的开发包。一般在maven项目的pom.xml文件中引入即可,不需要开启neo4j服务器。 - Neo4j API - 服务器模式: - 必须先安装和启动neo4j服务器,然后引入neo4j的驱动程序。同样在maven项目的pom.xml文件中引入即可。 - REST API - 遍历框架: - Traversal framework Java API https://neo4j.com/docs/java-reference/3.2/
使用neo4j API时,无论是什么操作都需要开启事务管理。也就是说操作数据库的程序都必须写在如下的代码段中:
try( Transaction tx = graphDb.beginTx()){ …… tx.success(); }使用完数据库后一定不要忘了关闭数据库。
为了保持数据的完整性和保证良好的事务行为,Neo4j也支持ACID特性: - 原子性:一整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 - 一致性:在事务开始之前和事务结束以后,数据库的完整性限制没有被破坏。 - 隔离性:两个事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。 - 持久性:在事务完成以后,该事务对数据库所作的更改便持久地保存在数据库之中,并不会被回復。 - 除了上面的事务特性,Neo4j还有自己的特殊规定。
以不同方式,建模策略利用结点、关系、属性和标签建模。 - 特定领域的简单的模型可以使用Neo4j-ogm进行构建 http://blog.csdn.net/xqclll/article/details/60578982 - 使用 Java 核心 API
http://blog.csdn.net/xingxiupaioxue/article/details/71747284
