图数据库Neo4j单机部署(1)图数据库查询和关系型数据库不同,增加了数量与深度的关系[1],提高查询效率。
(2)Neo4j由Java开发,可以支持JAVA,Python,PHP, .NET等语言进行增删改查,Java为主[2]。验证Neo4j图数据库对存储具有复杂关系数据的高效性能,以及支持图算法的快速查询。
(3)支持无向图遍历,但添加图好像只能是有向图。
一、在单机上部署Neo4j
(1)部署方式[3]
1)安装JDK 1.6+
2)将neo4j的community版本下载完毕后,进行解压,运行的命令是: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(); } }
形成的图结构:
(专辑和歌曲少了一个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)查询
Cypher是Neo4J自己提供的一种高效类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