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
相关文章推荐
- 继承中的构造、析构总结
- 深入理解 JSX
- 深入理解 JSX
- 深入理解 JSX
- QT树莓派交叉编译环开发环境搭建(附多个exe工具下载链接)
- 在linux下源码编译x265
- ACID原则
- Quartz(02) 两种Trigger(SimpleTrigger/CronTrigger)
- (十一)、数组的简单操作
- POJ 1261 Period KMP 周期-循环
- Java基础之(十六)多态
- 图解Linux命令之--which命令
- 跟我一起写Makefile(3)--- make如何工作+makefile使用变量
- windows 上使用 zephir 开发php扩展
- C++大数(正整数)相加相减v1
- asp.net core项目发布网站时的选项
- hbm.xml中一方<set>结点的inverse属性
- 我的Android学习笔记(一)
- windows开发php扩展
- caffe中各个层——解析