Neo4j
Neo4j’s Graph Platform is bringing a connections-first approach to applications and analytics across the enterprise.
Why 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 一下协议就行。然后自动下载组件安装即可。
完成后首页界面如下:
New Database
直接点击【New Database】 新建一个本地数据库,并且点击【Start】运行。
可以直接打开内置的 Neo4j Browser,或者浏览器打开 http://localhost:7474/browser/
界面如下:
可以在命令行输入框执行对应的 SQL 脚本,后面直接运行即可。
SQL 脚本为 Cypher 语法。
CRUD
增
- 插入节点
插入一个 Person 类别的节点,且这个节点有一个属性 name,属性值为 Node A
$ CREATE (a:Person { name : 'Node A'});
在插入另一个节点:
$ CREATE (b:Person { name : 'Node B'});
执行查询
$ MATCH (n) return n;
结果如下
- 插入边
插入一条 a 到 b 的有向边,且边的类别为 Follow
MATCH (a:Person),(b:Person)
WHERE a.name = 'Node A' AND b.name = 'Node B'
CREATE (a)-[r:Follow]->(b);
再次查询,结果如下:
改
- 更新节点信息
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
文档写的很赞,以后有时间定当拜读一下。