Neo4j

Neo4j’s Graph Platform is bringing a connections-first approach to applications and analytics across the enterprise.

Why Neo4j?

top-ten-reasons

为什么选择图形数据库,为什么选择Neo4j?

  • 更快的数据库操作

当然,有一个前提条件,那就是数据量较大,在MySql中存储的话需要许多表,并且表之间联系较多(即有不少的操作需要join表)。

  • 数据更直观

相应的SQL语句也更好写(Neo4j使用Cypher语言,与传统SQL有很大不同)。

  • 更灵活

不管有什么新的数据需要存储,都是一律的节点和边,只需要考虑节点属性和边属性。而MySql中即意味着新的表,还要考虑和其他表的关系。

  • 性能更好

数据库操作的速度并不会随着数据库的增大有明显的降低。这得益于Neo4j特殊的数据存储结构和专门优化的图算法。

简单对比

目前,arangodb 速度相对更快,但是 neo4j 更稳定。

注意:

图形数据库是这几年兴起的,整体还不是很完善,而且适用面也是比较窄的。只有在明确自己的需求之后,才能确定是否选择图形数据库。

Quick Start

Download

直接在 官网下载,期间需要添加个注册信息,简单填写即可。

Install

本次测试环境为 win7 系统,neo4j-1.0.9 版本。

运行程序 neo4j-desktop-1.0.9-setup.exe

安装的步骤及其简单,直接 Accept 一下协议就行。然后自动下载组件安装即可。

完成后首页界面如下:

2018-01-08-neo4j-index.png

New Database

直接点击【New Database】 新建一个本地数据库,并且点击【Start】运行。

可以直接打开内置的 Neo4j Browser,或者浏览器打开 http://localhost:7474/browser/

界面如下:

2018-01-08-neo4j-database-index.png

可以在命令行输入框执行对应的 SQL 脚本,后面直接运行即可。

SQL 脚本为 Cypher 语法。

CRUD

  • 插入节点

插入一个 Person 类别的节点,且这个节点有一个属性 name,属性值为 Node A

$   CREATE (a:Person { name : 'Node A'});

在插入另一个节点:

$   CREATE (b:Person { name : 'Node B'});

执行查询

$   MATCH (n) return n;

结果如下

2018-01-08-neo4j-create-nodes.png

  • 插入边

插入一条 a 到 b 的有向边,且边的类别为 Follow

MATCH (a:Person),(b:Person)
WHERE a.name = 'Node A' AND b.name = 'Node B'
CREATE (a)-[r:Follow]->(b);

再次查询,结果如下:

2018-01-08-neo4j-create-side.png

  • 更新节点信息
MATCH (n:Person { name: 'Node A' })
SET n.name = 'Node A Updated'; 

查询结果会自动变化,不在赘述。

  • 最短路径
MATCH (a:Person { name:'Node A Updated' }),(b:Person { name:'Node B' }), p = shortestPath((a)-[r:Follow]-(b)) 
RETURN p;

结果如下:

╒════════════════════════════════════════════════╕
│"p"                                             │
╞════════════════════════════════════════════════╡
│[{"name":"Node A Updated"},{},{"name":"Node B"}]│
└────────────────────────────────────────────────┘
  • 查询两个节点之间的关系。
MATCH (a:Person { name:'Node A Updated' })-[r]->(b:Person { name:'Node B' }) RETURN type(r);

查询结果:

╒═════════╕
│"type(r)"│
╞═════════╡
│"Follow" │
└─────────┘
  • 查询一个节点的所有 Follower。
MATCH (:Person { name:'Node A Updated' })-[r:Follow]->(Person)
RETURN Person.name;

查询结果:

╒═════════════╕
│"Person.name"│
╞═════════════╡
│"Node B"     │
└─────────────┘
  • 查看所有的节点数和边数
MATCH (n) RETURN count(n);
MATCH ()-->() RETURN count(*);

  • 删除节点和与其相连的边

Neo4j 中如果一个节点有边相连,是不能单单删除这个节点的。

MATCH (n:Person { name:'Node A Updated' })
DETACH DELETE n;
  • 删除边
MATCH (a:Person)-[r:Follow]->(b:Person)
WHERE a.name = 'Node A Updated' AND b.name = 'Node B'
DELETE r;

Java Integration

Java 与 Neo4j 不得不说的故事

文档写的很赞,以后有时间定当拜读一下。