原文链接:https://blog.csdn.net/sinat_36226553/article/details/108541370
# 图数据库
一般认为具有“无索引邻接”特性的图数据库才称为原生图数据库
链接:常用的图数据库
图存储可以分为属性图、三元组存储和混合系统 [来源]
- Property Graphs
- Triple Stores and Semantic Databases
-
Hybrid and Exotic Systems
# Neo4j 介绍
Neo4j是一个高性能的NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。
在一个图中包含两种基本的数据类型:Nodes(节点) 和 Relationships(关系)。Nodes 和 Relationships 包含key/value形式的属性。Nodes通过Relationships所定义的关系相连起来,形成关系型网络结构。其形式如下:
基于neo4j的这种存储特点,经常用其来存储owl、rdf文件。
Neo4j是开源的,很多编程语言,如Node.js、Python、PHP、Ruby、.NET等都提供了对Neo4j的支持。如Node.js可以通过指令“ npm install neo4j-driver ”在Node.js中安装Neo4j Driver;python可以通过" pip install py2neo " 安装依赖包。
# 安装
-
Win10 安装 Neo4j
1、前提需要
安装JAVA SE的JDK(cmd输入java -version
检查是否安装好
注意:jdk 和 neo4j 版本匹配有要求 [链接] (由于我的jdk是1.8,这里选择安装 neo4j-3.5.3,neo4j 4.x以上版本需要 java11
2、版本区别
社区版(Community Edition):基本的、功能齐全的高性能图形数据库。
企业版(Enterprise Edition):企业版相比社区版增加了许多典型的企业功能,如集群、高级监控、高级缓存、在线备份等
注:Neo4j 大多数用户都是从社区版开始开发应用,然后在生产环境下使用企业版。Neo4j企业版是要收费的,而只有企业版才能使用分布式安装,并且可以提供负载均衡和高可用配置等功能。社区版只能单机使用,最多可以使用数十亿个节点、关系和属性。
《知识图谱:方法、实践与应用》:Neo4j的不足之处在于其社区版是单机系统,虽然Neo4j企业版支持高可用性(High availability)集群,但其与分布式图存储系统的最大区别在于每个节点上存储图数据库的完整副本(类似于关系数据库镜像的副本集群),而不是将图数据划分为子图进行分布式存储,而并非真正意义上的分布式数据库系统。如果图数据超过一定规模,系统性能就会因为磁盘、内存等限制而大幅降低
3、安装流程
官网地址:https://neo4j.com/download-center (截至目前最新版本为 4.1.1
国内镜像:http://doc.we-yun.com:1008/neo4j
解压到自定义目录,如我的是 W:\Neo4j\neo4j-community-3.5.3
Neo4j应用程序有如下主要的目录结构:
- bin目录:用于存储Neo4j的可执行程序;
- conf目录:用于控制Neo4j启动的配置文件;
- data目录:用于存储核心数据库文件;
- plugins目录:用于存储Neo4j的插件;
配置环境变量 NEO4J_HOME,并在Path中添加 %NEO4J_HOME%\bin
打开cmd命令行,输入命令:neo4j console (有时候识别不了该命令,改用管理员方式打开cmd
注:停止neo4j服务器在cmd键入CTRL+C即可
在浏览器 http://localhost:7474 中查看Neo4j数据库 (默认的host是bolt://localhost:7687,默认的用户是neo4j,其默认的密码是:neo4j,第一次成功登陆到Neo4j服务器之后,需要重置密码
⭐如果忘记了密码,解决方法是停止服务,进入/data/dbms目录,删除auth文件
其他方式:使用exe文件安装Neo4j
-
Linux 安装 Neo4j
使用Linux系统,最低要求使用EXT4文件系统(或类似)。推荐使用EXT4、ZFS等文件系统。CentOS 6.5使用的是EXT4文件系统,CentOS 7 使用的是XFS文件系统。XFS是一个比EXT4更加高级的文件系统,所以CentOS 6.5以上版本都符合要求。即Linux操作系统可以使用Ubuntu、Debian或CentOS 6.5及以上版本。
CentOS 6.9教程:https://blog.csdn.net/sinat_36226553/article/details/108583059
-
中文版Neo4j
微云数聚(北京)有限公司自主研发实现的Neo4j简体中文版。该版本除了提供Neo4j简体中文界面外,还提供了特别适合中国用户习惯的一组扩展功能。
Neo4j 简体中文版 下载地址:http://we-yun.com/index.php/blog/release-56.html (目前支持Windows、Linux
导入精灵:一种支持将Excel、MySQL和Oracle等数据简便地导入到Neo4j的工具
导入精灵 下载地址:http://we-yun.com:8000/ToNeo4j/
# Neo4j 配置
配置文档存储在conf目录下,Neo4j通过配置文件neo4j.conf控制服务器的工作。默认情况下,不需要进行任意配置,就可以启动服务器。
1. 核心数据文件的位置
例如,核心数据文件存储的位置,默认是在data/graph.db目录中,要改变默认的存储目录,可以更新配置选项:
# The name of the database to mount
#dbms.active_database=graph.db
2. 安全验证,默认是启用的
# Whether requests to Neo4j are authenticated.
# To disable authentication, uncomment this line
#dbms.security.auth_enabled=false
取消该注释,则控制台就不会再输出下图所示警告
3. 配置JAVA 堆内存的大小
如果内存不够,会报错:Neo4j bulk import “neo4j-admin import” OutOfMemoryError: Java heap space and OutOfMemoryError: GC overhead limit exceeded
# Java Heap Size: by default the Java heap size is dynamically # calculated based on available system resources. # Uncomment these lines to set specific initial and maximum heap size. #dbms.memory.heap.initial_size=512m #dbms.memory.heap.max_size=512m
4. 配置访问
Neo4j的默认配置只支持本地访问,为了使其能够支持远程访问,可以修改相关配置。
Neo4j支持三种不同的连接方式:Bolt、HTTP、HTTPS。Neo4j的Web客户端使用的是HTTP连接方式,在程序开发中一般可使用HTTP和Bolt连接方式。HTTPS需要有安全证书支持,如果想让数据库开放在外网中访问,可以使用这种连接方式。
5. 负载均衡
当使用图数据库集群时,我们应该考虑集群的负载均衡,从而最大化吞吐量并减少延迟时间。Neo4j自身没有负载均衡功能,而是依赖于网络基础设施的负载均衡能力。
# Cypher
像Oracle数据库具有查询语言SQL,Neo4j具有Cypher作为查询语言。
Cypher是一种声明式的模式匹配查询语言,使图数据库管理变得易于理解、易于操作,即便是技术较差的用户也可以使用Cypher轻松操作图数据库。
neo4j的Cypher命令框(换行按 Shift + Enter、Cypher用 // 进行注释
语法
如果我们想用Cypher来表达罗密欧爱朱丽叶,那么Cypher的语法如下:
(romeo:Person{name:"Romeo"}) - [:LOVES] -> (juliet:Person{name:"Juliet"})
即
(NODE1) - [:RELATION] -> (NODE2)
语法约定
节点用小写驼峰;标签用大写驼峰;关系用蛇形大写(类似IS_A);属性名用小写驼峰;关键词全部用大写。
关于大小写
大小写敏感:节点标签、关系类型、属性名/键
大小写不敏感:Cypher 关键字
-
创建数据(CREATE)
在neo4j创建该节点及其关系。我们创建了一个节点romeo,它带有Person标签和一个字符类型的name属性,属性值为Romeo。然后创建了一个叫LOVES的关系连接到另一个节点juliet
CREATE (romeo:Person{name:"Romeo"}) - [:LOVES] - > (juliet:Person{name:"Juliet"})
-
读取数据(READ)
-
MATCH (n:Person)
- [:LOVES]
- ()
-
WHERE toLower(n.name)
="juliet"
-
RETURN n
ORDER
BY n.age
ASC
-
SKIP
2 LIMIT
5;
-
-
#
asc从小到大,没有age属性的节点将放在列表最后
-
#
SKIP和LIMIT用于对结果进行分页
根据某属性查询某节点
查询节点的所有属性
查询节点的所有键
-
更新数据(UPDATE)
-
MATCH (n:Person)
-
SET n.age
=n.age
+
1
-
RETURN n;
-
删除数据(DELETE)
-
MATCH (r:Person{name:
'romeo'})
-
DELETE r;
-
MERGE
MERGE比较像MATCH和CREATE的混合。如果MERGE语句中描述的模式在图中已经存在,语句描述的标识符将被绑定在这个存在的数据中,这就好比MATCH;如果它描述的模式在图中不存在,那么MERGE会先创建它,这就好比CREATE。
了解CQL更多命令请点击 [链接]
俞方桦博士系列教程
Neo4j Cypher 图数据库查询语言快速参考 - 【1】 基本语法 : PDF
Neo4j Cypher 图数据库查询语言快速参考 - 【2】创建和删除节点、关系和属性:PDF
Neo4j Cypher 图数据库查询语言快速参考 - 【3】索引和限制:PDF
# 图数据库与关系数据库
原生图存储和原生图处理并不一定比其他方式更好或更差——这不过是典型的工程取舍而已。除了采用了特定的存储和处理方式以外,图数据库还要使用特定的数据模型。常用的几种不同的图数据模型,包括属性图、超图和三元组。
原生图存储的好处是,它的栈是专门为性能和扩展性设计建造的。但相对的,非原生图存储通常建立在非常成熟的非图后端(如MySQL)之上,运维团队对它们的特性烂熟于心。原生图处理(免索引邻接)虽然在遍历查询性能优势很大,但代价是一些未使用遍历的查询会比较困难,而且需要占用巨大的内存。
虽然E-R图是一种图,但我们马上就能从它看出关系模型在对复杂领域建模的短板。尽管它可以像图数据库一样给联系命名(关系型数据库没有这一功能),但在两个实体之间,E-R图只允许我们建立一条、无向的命名的联系。从这个方面来说,真实世界的实体之间的联系丰富多彩、种类繁多,关系模型就不适合表示了。
# 系列