图数据库(Graph Database)是NoSQL数据库家族中特殊的存在,用于存储丰富的关系数据,Neo4j[1]是目前最流行的图数据库,支持完整的事务。在属性图中,图是由顶点(Vertex),边(Edge)和属性(Property)组成的,顶点和边都可以设置属性,顶点也称作节点,边也称作关系,每个节点和关系都可以由一个或多个属性。Neo4j创建的图是用顶点和边构建一个有向图,其查询语言cypher已经成为事实上的标准。
关于Neo4j的相关知识,在[2]中也有所介绍,neo4j数据库的安装可参照链接中的文章,这里我给大家演示一个小例子体验一下Neo4j图数据库。
一:下载和部署Neo4j
1 安装Java JDK
Neo4j是基于Java的图形数据库,运行Neo4j需要启动JVM进程,因此必须安装JAVA SE的JDK。从Oracle官方网站下载 JavaSE JDK,当前的版本是JDK8。

2 下载Neo4j安装文件
从Neo4j官网下载最新版本Neo4j3.3 社区(Community)版本 “neo4j-community-3.3.3-windows。zip”,解压到主目录,“D:\ProgramFiles\neo4j-community-3.3.3”。
Neo4j应用程序有如下主要的目录结构:
· bin目录:用于存储Neo4j的可执行程序;
· conf目录:用于控制Neo4j启动的配置文件;
· data目录:用于存储核心数据库文件;
· plugins目录:用于存储Neo4j的插件;
3 创建系统环境变量
创建主目录环境变量NEO4J_HOME,并把主目录设置为变量值。

二: Neo4j的核心配置
配置文档存储在conf目录下,Neo4j通过配置文件neo4j.conf控制服务器的工作。默认情况下,不需要进行任意配置,就可以启动服务器。
1 核心数据文件的位置
例如,核心数据文件存储的位置,默认是在data/graph.db目录中,要改变默认的存储目录,可以更新配置选项:
# The name of the database to mount#dbms.active_database=graph.db # Paths of directories in the installation.
#dbms.directories.data=data2 安全验证,默认是启用的
# Whether requests to Neo4j are authenticated.# To disable authentication, uncomment this line
#dbms.security.auth_enabled=false
3 配置JAVA 堆内存的大小
# 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三:网络连接配置
1 Neo4j支持三种网络协议(Protocol)
Neo4j支持三种网络协议(Protocol),分别是Bolt,HTTP和HTTPS,默认的连接器配置有三种,为了使用这三个端口,需要在Windows防火墙中创建Inbound Rules,允许通过端口7687,7474和7473访问本机。
2 连接器的可选属性

listen_address:设置Neo4j监听的链接,由两部分组成:IP地址和端口号(Port)组成,格式是:<ip-address>:<port-number>
3 设置默认的监听地址
设置默认的网络监听的IP地址,该默认地址用于设置三个网络协议(Bolt,HTTP和HTTPs)的监听地址,即设置网络协议的属性:listen_address地址。在默认情况下,Neo4j只允许本地主机(localhost)访问,要想通过网络远程访问Neo4j数据库,需要修改监听地址为 0.0.0.0,这样设置之后,就能允许远程主机的访问。
# With default configuration Neo4j only accepts local connections.
# To accept non-local connections, uncomment this line:
dbms.connectors.default_listen_address=0.0.0.0
4 分别设置各个网络协议的监听地址和端口
HTTP链接器默认的端口号是7474,Bolt链接器默认的端口号是7687,必须在Windows 防火墙中允许远程主机访问这些端口号。
# Bolt connectordbms.connector.bolt.enabled=true
#dbms.connector.bolt.tls_level=OPTIONAL#dbms.connector.bolt.listen_address=0.0.0.0:7687
# HTTP Connector. There must be exactly one HTTP connector.dbms.connector.http.enabled=true
#dbms.connector.http.listen_address=0.0.0.0:7474
# HTTPS Connector. There can be zero or one HTTPS connectors.#dbms.connector.https.enabled=true
#dbms.connector.https.listen_address=0.0.0.0:7474
四:启动Neo4j
1 通过控制台启动Neo4j程序
点击组合键:Windows+R,输入cmd,启动DOS命令行窗口,切换到主目录,以管理员身份运行命令:
neo4j.bat console如果看到以下消息,说明neo4j已经开始运行:
2 把Neo4j安装为服务(Windows Services)
安装和卸载服务:
bin\neo4j install-servicebin\neo4j uninstall-service启动服务,停止服务,重启服务和查询服务的状态:
bin\neo4j startbin\neo4j stopbin\neo4j restartbin\neo4j status五:打开Neo4j集成的浏览器
1 Neo4j浏览器
Neo4j服务器具有一个集成的浏览器,在一个运行的服务器实例上访问 “http://localhost:7474/”,打开浏览器,显示启动页面

默认的host是bolt://localhost:7687,默认的用户是neo4j,其默认的密码是:neo4j,第一次成功登陆到Neo4j服务器之后,需要重置密码。
访问Graph Database需要输入身份验证,Host是Bolt协议标识的主机。
2 在Neo4j浏览器中创建节点和关系

示例,编写Cypher命令,创建两个节点和两个关系:
CREATE (n:Person { name: 'Andres', title: 'Developer' }) return n;
CREATE (n:Person { name: 'Vic', title: 'Developer' }) return n;
match(n:Person{name:"Vic"}),(m:Person{name:"Andres"}) create (n)-[r:Friend]->(m) return r;
match(n:Person{name:"Vic"}),(m:Person{name:"Andres"}) create (n)<-[r:Friend]-(m) return r;
在$ 命令行中,编写Cypher脚本代码,点击Play按钮,点击创建第一个节点,

在第一个节点创建之后,在Graph模式下,能够看到创建的图形,继续编写Cypher脚本,创建其他节点和关系

在创建完两个节点和关系之后,查看数据库中的图形:

六:Neo4j图形数据结构
Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。程序员工作在一个面向对象的、灵活的网络结构下而不是严格、静态的表中——但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。
Neo4j因其嵌入式、高性能、轻量级等优势,越来越受到关注。
在一个图中包含两种基本的数据类型:Nodes(节点)和 Relationships(关系)。Nodes 和 Relationships 包含key/value形式的属性。Nodes通过Relationships所定义的关系相连起来,形成关系型网络结构。
从这几个方面来说,Neo4j是一个合适的选择。Neo4j
· 自带一套易于学习的查询语言(名为Cypher)
· 不使用schema,因此可以满足你的任何形式的需求
· 与关系型数据库相比,对于高度关联的数据(图形数据)的查询快速要快上许多
· 它的实体与关系结构非常自然地切合人类的直观感受
· 支持兼容ACID的事务操作
· 提供了一个高可用性模型,以支持大规模数据量的查询,支持备份、数据局部性以及冗余
· 提供了一个可视化的查询控制台,你不会对它感到厌倦的
七:什么时候不应使用Neo4j?
作为一个图形NoSQL数据库,Neo4j提供了大量的功能,但没有什么解决方案是完美的。在以下这些用例中,Neo4j就不是非常适合的选择:
· 记录大量基于事件的数据(例如日志条目或传感器数据)
· 对大规模分布式数据进行处理,类似于Hadoop
· 二进制数据存储
· 适合于保存在关系型数据库中的结构化数据
八:Neo4j存储模型
上面的英文摘自<GraphDatabases>
(作者:IanRobinson)一书,描述了 neo4j 的存储模型。Node和Relationship 的 Property 是用一个 Key-Value 的双向列表来保存的; Node 的 Relatsionship 是用一个双向列表来保存的,通过关系,可以方便的找到关系的from-to Node. Node 节点保存第1个属性和第1个关系ID。
通过上述存储模型,从一个Node-A开始,可以方便的遍历以该Node-A为起点的图。下面给个示例,来帮助理解上面的存储模型。
示例1
在这个例子中,A~E表示Node 的编号,R1~R7 表示 Relationship
编号,P1~P10 表示Property
的编号。
· Node 的存储示例图如下,每个Node
保存了第1个Property
和 第1个Relationship
:

· 关系的存储示意图如下:

从示意图可以看出,从 Node-B 开始,可以通过关系的next 指针,遍历Node-B 的所有关系,然后可以到达与其有关系的第1层Nodes,在通过遍历第1层Nodes的关系,可以达到第2层Nodes。
[1] https://neo4j.com/
[2] http://www.cnblogs.com/ljhdo/category/998219.html
本文内容仅个人观点,如有错误和不足之处还望大家雅正,如果对您有所帮助则是我的荣幸,如需本文相关资料请发邮件到zhangguoqingas@gmail.com或留言!






