您的位置:首页 > 其它

GraphDB Neo4J笔记

2016-08-06 21:09 369 查看

</pre> 图数据库Neo4j<span style="font-family:宋体">单机部署</span></h2><h3>概述</h3><p>(<span style="font-family:Arial">1</span><span style="font-family:宋体">)图数据库查询和关系型数据库不同,增加了数量与深度的关系</span>[1],提高查询效率。</p><p>(<span style="font-family:Arial">2</span><span style="font-family:宋体">)</span><span style="font-family:Arial">Neo4j</span><span style="font-family:宋体">由</span><span style="font-family:Arial">Java</span><span style="font-family:宋体">开发,可以支持</span>JAVA<span style="font-family:宋体">,</span><span style="font-family:Times New Roman">Python</span><span style="font-family:宋体">,</span><span style="font-family:Times New Roman">PHP, .NET</span><span style="font-family:宋体">等语言</span>进行增删改查,Java<span style="font-family:宋体">为主</span>[2]。验证Neo4j<span style="font-family:宋体">图数据库对存储具有复杂关系数据的高效性能,以及支持图算法的快速查询。</span></p><p>(<span style="font-family:Arial">3</span><span style="font-family:宋体">)支持无向图遍历,但添加图好像只能是有向图。</span></p><h3>相关操作</h3><p>一、在单机上部署<span style="font-family:Arial">Neo4j</span></p><p>(1)部署方式[3]</p><p><span style="white-space:pre"></span>1<span style="font-family:宋体">)</span>安装JDK 1.6+</p><p><span style="white-space:pre"></span>2<span style="font-family:宋体">)将</span><span style="font-family:Times New Roman">neo4j</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">community</span><span style="font-family:宋体">版本下载完毕后,进行解压,运行的命令是:</span><span style="font-family:Times New Roman">tar </span><span style="font-family:宋体">–</span><span style="font-family:Times New Roman">zvxf neo4j-community-2.0.1.tar.gz</span></p><p><span style="white-space:pre"></span>3<span style="font-family:宋体">)修改</span><span style="font-family:Times New Roman">conf/neo4j-server.properties</span><span style="font-family:宋体">配置文件,将</span><span style="font-family:Times New Roman">org.neo4j.server.webserver.address=0.0.0.0</span><span style="font-family:宋体">注释字符去掉</span></p><p><span style="white-space:pre"></span>4<span style="font-family:宋体">)最后进入</span><span style="font-family:Times New Roman">bin</span><span style="font-family:宋体">目录,启动</span><span style="font-family:Times New Roman">neo4j</span><span style="font-family:宋体">的服务即可。</span></p><p><span style="white-space:pre"></span>5) 输入<span style="font-family:Times New Roman">//ip:7474/webadmin </span><span style="font-family:宋体">即可进入</span><span style="font-family:Times New Roman">neo4j</span><span style="font-family:宋体">控制台</span></p><p>(2)数据存储</p><p><span style="white-space:pre"></span>1)连接<span style="font-family:Arial">Neo4j</span></p><p><span style="white-space:pre"></span>2)数据以“节点<span style="font-family:Arial">-</span><span style="font-family:宋体">关系”形式写入</span><span style="font-family:Arial">Neo4j</span><span style="font-family:宋体">中,以歌手发布专辑,专辑包含歌曲为例:</span></p><p style="background:rgb(247,247,247)"></p><pre name="code" class="java">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的概念<
95cb
/span>。

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

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

最短路径:

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


Dijkstra:

PathFinder<WeightedPath> 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: