GraphDB Neo4J笔记

 图数据库Neo4j单机部署

概述

1)图数据库查询和关系型数据库不同,增加了数量与深度的关系[1],提高查询效率。

2Neo4jJava开发,可以支持JAVAPythonPHP, .NET等语言进行增删改查,Java为主[2]。验证Neo4j图数据库对存储具有复杂关系数据的高效性能,以及支持图算法的快速查询。

3)支持无向图遍历,但添加图好像只能是有向图。

相关操作

一、在单机上部署Neo4j

(1)部署方式[3]

1安装JDK 1.6+

2)将neo4jcommunity版本下载完毕后,进行解压,运行的命令是:tar zvxf neo4j-community-2.0.1.tar.gz

3)修改conf/neo4j-server.properties配置文件,将org.neo4j.server.webserver.address=0.0.0.0注释字符去掉

4)最后进入bin目录,启动neo4j的服务即可。

5) 输入//ip:7474/webadmin 即可进入neo4j控制台

(2)数据存储

1)连接Neo4j

2)数据以“节点-关系”形式写入Neo4j中,以歌手发布专辑,专辑包含歌曲为例:

private static enum RelationshipTypes implements RelationshipType { 
    PUBLISH, CONTAIN 
 } 
 public void useNodeAndRelationship() { 
    GraphDatabaseService db = new EmbeddedGraphDatabase("music"); 
    Transaction tx = db.beginTx(); 
    try { 
        Node node1 = db.createNode(); 
        node1.setProperty("name", "歌手 1"); 
        Node node2 = db.createNode(); 
        node2.setProperty("name", "专辑 1"); 
        node1.createRelationshipTo(node2, RelationshipTypes.PUBLISH); 
        Node node3 = db.createNode(); 
        node3.setProperty("name", "歌曲 1"); 
        node2.createRelationshipTo(node3, RelationshipTypes.CONTAIN); 
        tx.success(); 
    } finally { 
        tx.finish(); 
    } 
 }

形成的图结构:

GraphDB Neo4J笔记_第1张图片

(专辑和歌曲少了一个CONTAIN)

二、利用Neo4j提供的图算法API操作数据库。

(1)遍历

Neo4j将遍历方法封装在Traversal类中,可以自己指定遍历方式,参数[4]如下:

Order : 对应的图的遍历算法

DEPTH_FIRST :  深度优先搜索,就是找到第一个节点,递归的一直往下找,直到找不到合适的节点后,才进行回溯

BREADTH_FIRST :  广度优先搜索

Direction :对应图中edge的方向

OUTGOING : 出边

INCOMING : 入边

BOTH : 顾明思议

StopEvaluator : 定义图搜索的停止条件,默认有两个

DEPTH_ONE :  深度超过1后停止

END_OF_GRAPH :  无合适结果和停止

ReturnableEvaluator : 结果处理器,可以设置对应的返回结果,默认有:

ALL_BUT_START_NODE :  排除初始节点

ALL : 返回所有节点

TraversalPosition : 对应搜索过程中的node节点信息,包括:

上一个节点信息

上一个进入的Relationship信息

搜索深度

目前为止满足条件的节点数

(2)查询

CypherNeo4J自己提供的一种高效类SQL语言,基于图论的搜索算法,实现了一套查询语言解析,提供了一些常见的聚合函数(max,sum,min,count),用于图数据和关系查询[5]。关系查询采用一种模式匹配的方式,比较直观[6]。

(3)索引

neo4j中针对每个node/relationship/property都是进行独立存储,都是按照自然的顺序。为了支持一些场景,比如针对关系型数据库的根据主键name查询对应的person node,普通的Traversal很难满足这样的需求,而且Traversal也不是用来解决这个事的。所以neo4j就引出了一个index的概念

索引引擎:lucene是以2叉树为基础的B树倒排结构,复杂度log(n)

(4)neo4j中集成了一些常用的图算法,包括最短路径,Dijkstra,A*等算法[7]

最短路径:

public Iterable findShortestPath(Node node1, Node node2) {
PathFinder finder = GraphAlgoFactory.shortestPath(
Traversal.expanderForTypes(RelTypes.KNOWS, Direction.BOTH), 10);
Iterable paths = finder.findAllPaths(node1, node2);
return paths;
}
for(Path shortestPath: findShortestPath(aa, ab)) {  
            System.out.println(shortestPath.toString());  
}
Traversal.expanderForTypes用来定义遍历的深度和节点关系的出入度。

Dijkstra:

PathFinder finder = GraphAlgoFactory.dijkstra(
        Traversal.expanderForTypes( ExampleTypes.MY_TYPE, Direction.BOTH ), "cost" );
 
WeightedPath path = finder.findSinglePath( nodeA, nodeB );
path.weight();

总结

优点:

一、完整的ACID

二、支持数十亿节点数

三、通过遍历工具高速检索数据,每秒上亿的检索量,一个检索类似于RDBMS的连接(_join_)操作

四、轻便灵活,嵌入式,资料齐全,使用广泛

五、Neo4J自身提供WEB界面的图数据图形化展现工具

六、Neo4j提供了非常快的图算法、推荐系统和OLAP风格的分析

缺点:

一、社区版不支持HA,不能部署在集群上

参考资料

[1]https://neo4j.com/why-graph-databases/

[2]http://www.tuicool.com/articles/UbQZbu

[3]http://www.educity.cn/os/1573375.html

[4]http://agapple.iteye.com/blog/1128400

[5]http://www.cnblogs.com/starcrm/p/5033117.html

[6]http://bbs.csdn.net/topics/390511137

[7]http://jason691353279.iteye.com/blog/2056339

你可能感兴趣的:(大数据)