Neo4j安装&入门&一些优缺点

本篇将介绍Neo4j的安装,入门,和本身使用了一段时间后发现的优势缺点,争取简洁和实用。html

若是你是第一次接触Neo4j,而且以前也都没接触过相似的Graph Database的话,建议先浏览一下我以前的一篇博客:为何选择图形数据库,为何选择Neo4j?。毕竟应该在作一件事以前要想清楚为何要作是吧。java


1. 安装

上Neo4j官网,下载community版,点击安装便可。很简单没什么可说的。sql


2. 入门

既然是入门,那就从简单开始,一步一步熟悉Neo4j。mongodb

2.1 图形操做界面

运行Neo4j后,在浏览器中打开网页:http://localhost:7474, 便可进入Neo4j的图形操做界面,在里面能够直接操做数据库,也能够查看数据库的状态。数据库

页面顶端能够直接写Cypher语句并运行。右侧则显示一些数据库的状态以及提供一部分操做,包括:浏览器

  • Database Information。数据库信息。节点类别,边的类别,属性(包括节点的属性和边的属性)。
  • Favorites。写好的基本数据库语句,包括建立节点,查询节点个数,边个数等。建立示例图。查看数据库的状态。
  • Documentation。各类官方文档。
  • Neo4j Browser Sync。清空本地数据库。与云端数据库同步。
  • Browser Settings。图形操做界面的设置。

2.2 Cypher基本语句

Cypher是Neo4j的数据库语言,入门的话起码得知道增删改查吧。session

  • 插入节点。插入一个Person类别的节点,且这个节点有一个属性name,属性值为Andres
CREATE (n:Person { name : 'Andres'});
  • 插入边。插入一条a到b的有向边,且边的类别为Follow
MATCH (a:Person),(b:Person)
WHERE a.name = 'Node A' AND b.name = 'Node B'
CREATE (a)-[r:Follow]->(b);
  • 更新节点。更新一个Person类别的节点,设置新的name。
MATCH (n:Person { name: 'Andres' })
SET n.name = 'Taylor';
  • 删除节点和与其相连的边。Neo4j中若是一个节点有边相连,是不能单单删除这个节点的。
MATCH (n:Person { name:'Andres' })
DETACH DELETE n;
  • 删除边。
MATCH (a:Person)-[r:Follow]->(b:Person)
WHERE a.name = 'Andres' AND b.name = 'Taylor'
DELETE r;

接着就是查询语句了,做为图形数据库,确定要来点不同凡响的查询对吧。ide

  • 最短路径。
MATCH (ms:Person { name:'Andres' }),(cs:Person { name:'Taylor' }), p = shortestPath((ms)-[r:Follow]-(cs)) RETURN p;
  • 查询两个节点之间的关系。
MATCH (a:Person { name:'Andres' })-[r]->(b:Person { name:'Taylor' })
RETURN type(r);
  • 查询一个节点的全部Follower。
MATCH (:Person { name:'Taylor' })-[r:Follow]->(Person)
RETURN Person.name;

还有更多的操做能够参考官方用户手册:官方用户手册post

2.3 建立一个Neo4j数据库

运行Neo4j以后,在软件窗口能够选择数据库建立位置,以后Neo4j就自动为咱们建立好了数据库。性能

此处输入图片的描述

  • 建立惟一性约束,同时具备索引效果,相似关系型数据库中的主键。注意,这只能在数据库中还未插入数据时设置。
CREATE CONSTRAINT ON (a:Person) ASSERT a.name IS UNIQUE;
  • 建立索引。
CREATE INDEX ON :Person(name);
  • 查看全部的节点数和边数
MATCH (n) RETURN count(n);
MATCH ()-->() RETURN count(*);

还有更多的操做能够参考官方用户手册:官方用户手册

2.4 Neo4j驱动

Neo4j提供了数种语言的数据库驱动,好比在java中,你能够这样插入一个节点:

Driver driver = GraphDatabase.driver( "bolt://localhost", AuthTokens.basic( "neo4j", "neo4j" ) );
Session session = driver.session();

session.run( "CREATE (a:Person {name:'Arthur'})" );

session.close();
driver.close();

查询节点:

Driver driver = GraphDatabase.driver( "bolt://localhost", AuthTokens.basic( "neo4j", "neo4j" ) );
Session session = driver.session();

StatementResult result = session.run( "MATCH (a:Person) WHERE a.name = 'Arthur' RETURN a.name AS name" );
while ( result.hasNext() )
{
    Record record = result.next();
    System.out.println( record.get("name").asString() );
}

session.close();
driver.close();

3. 优缺点

使用了一段时间Neo4j,总结一下我发现的优缺点。

优势:

  1. 数据的插入,查询操做很直观,不用再像以前要考虑各个表之间的关系。
  2. 提供的图搜索和图遍历方法很方便,速度也是比较快的。

缺点:

  1. 最不能让人忍受的就是极慢的插入速度。多是由于建立节点和边的时候须要保存一些额外信息(为了查询服务)。不知道是否是我代码的问题,插入10000个节点,10000条边花了将近10分钟...
  2. 超大节点。当有一个节点的边很是多时(常见于大V),有关这个节点的操做的速度将大大降低。这个问题很早就有了,官方也说过会处理,然而如今仍然不能让人满意。
  3. 提升数据库速度的经常使用方法就是多分配内存,然而看了官方操做手册,貌似没法直接设置数据库内存占用量,而是须要计算后为其”预留“内存...

4. 适用场景

鉴于其明显的优缺点,Neo4j适合存储”修改较少,查询较多,没有超大节点“的图数据。

另外,针对Neo4j的缺点,有一款使用混合索引的数据库Arangodb也许是一个不错的考虑对象。根据其官网的说明,Arangodb不只具备通常图形数据库的优势,并且在各类操做的速度上领先于Neo4j。可见:原理上说明为何Arangodb更快Arangodb与其余几款数据库的性能对比

转载请注明出处:http://www.cnblogs.com/rubinorth/

相关文章
相关标签/搜索