什么是图形数据库?
图形数据库(Graph Database)是利用计算机将点、线、画霹图形基本元素按一定数据结同造型存储的数据集合。
最早应该使用在社交场景,比如QQ的几度空间关系图,除了社交应用之外,图数据库同很多应用可以工作。很多应用可以自然扩展使用图形类型的关系。比如,好多内嵌在社交应用中的推荐系统常常都是基于图形的系统。图数据库由一系列结点和边界组成;每一个结点代表了一个实体,每一个边界代表了两个结点之间的一种连接或者关系。
目前基于Java使用最广泛的有两个开源框架
(1) neo4j
社区版 免费
企业版 收费
(2) Titan
全开源
我们此次选择了neo4j的社区版,neo4j比较稳定,Titan可能比较新,虽然Titan肯定是未来的主流,Neo4j没法存储巨大的一张关系图 ,因为他不支持分片,而Titan是天生分布式的,可以构建在Hbase,Cassandra之上外加+ES或者Solr存储索引,非常强大。
Neo4j的安装
1.下载
下载地址: https://neo4j.com/download/community-edition/
或者点击下载,修改版本号后可以根据版本号下载指定版本
https://neo4j.com/artifact.php?name=neo4j-community_windows-x64_3_3_1.exe
2.安装。
下载后安装,安装成功后,start eno4j 选择存放数据库的位置,如:D:\Program Files\Neo4j
3.访问
访问地址:http://localhost:7474/browser/
默认用户名:neo4j 密码:neo4j
4.创建图
示例代码
CREATE
(p1:Person {name:'胡兴炯', born:1991, interest:'mac,ios,旅游', goodat:'java,swift,objectiveC'}),
(p2:Person {name:'张勇', born:1990, interest:'android', goodat:'java,android'}),
(p3:Person {name:'成文龙', born:1990, interest:'linux,hadoop', goodat:'linux,java,android'}),
(p4:Person {name:'王昕', born:1978, interest:'wpf,noSQL,旅游', goodat:'java,c#'}),
(p5:Person {name:'周开琪', born:1977 , interest:'管理', goodat:'管理,'}),
(p6:Person {name:'徐锦亮', born:1985, interest:'前端', goodat:'前端,html5,hadoop'}),
(p7:Person {name:'张三', born:1993, interest:'大数据', goodat:'hadoop,html5,java,lucene,elasticsearch,solr'}),
(p8:Person {name:'徐辉霞', born:1990, interest:'管理,旅游', goodat:'管理,采购'}),
(p9:Person {name:'黄廷鹏', born:1992, interest:'OA', goodat:'java'}),
(p10:Person {name:'史乐乐', born:1991, interest:'OA,旅游', goodat:'管理'}),
(p1)-[:认识]->(p2),
(p1)-[:认识]->(p3),
(p1)-[:认识]->(p4),
(p1)-[:认识]->(p5),
(p1)-[:认识]->(p9),
(p2)-[:认识]->(p1),
(p2)-[:认识]->(p3),
(p2)-[:认识]->(p4),
(p2)-[:认识]->(p5),
(p2)-[:认识]->(p9),
(p3)-[:认识]->(p1),
(p3)-[:认识]->(p2),
(p3)-[:认识]->(p4),
(p3)-[:认识]->(p5),
(p3)-[:认识]->(p7),
(p4)-[:认识]->(p1),
(p4)-[:认识]->(p2),
(p4)-[:认识]->(p3),
(p4)-[:认识]->(p5),
(p4)-[:认识]->(p9),
(p5)-[:认识]->(p1),
(p5)-[:认识]->(p2),
(p5)-[:认识]->(p3),
(p5)-[:认识]->(p4),
(p5)-[:认识]->(p6),
(p5)-[:认识]->(p8),
(p5)-[:管理]->(p1),
(p5)-[:管理]->(p2),
(p5)-[:管理]->(p3),
(p5)-[:管理]->(p4),
(p5)-[:管理]->(p6),
(p6)-[:认识]->(p5),
(p6)-[:认识]->(p4),
(p6)-[:夫妻]->(p8),
(p9)-[:认识]->(p1),
(p9)-[:认识]->(p2),
(p9)-[:认识]->(p3),
(p9)-[:认识]->(p10),
(p9)-[:喜欢]->(p10),
(p10)-[:认识]->(p9),
(p10)-[:同事]->(p7)
运行结果:
Neo4j实现小demo
(1) 创建自己的"me"节点
CREATE (me:Myself {name:"我"}) RETURN me
(2)创建与自己关系的节点
MATCH (me:Myself {name:"我"}) CREATE (me)-[like:LIKE]->(neo:NeoDatabase {name:"Neo4j" }) RETURN me,like,neo
3)批量创建与自己有关的朋友
MATCH (me:Myself {name:"我"}) FOREACH (name in ["张三","李四","王五","赵六","孙七"] | CREATE (me)-[:FRIEND]->(:Myself {name:name}))
(4) 查看me节点与friend
match (me {name:'我'})-[:FRIEND]->(mf) return me,mf
5)新建朋友圈之外的二度关系
match (neo:NeoDatabase {name : 'Neo4j'})
match (me {name:'我'})-[:FRIEND]->(mf)
match (anna {name:'张三'})
create (ama:Myself {name:'周八'})
create (ama)-[:WORKED_WITH]->(neo)
create (anna)-[:FRIEND]->(ama)
return me,mf,neo,anna,ama
(6) 查询:我通过朋友圈中的谁来学习neo4j
match (me:Myself {name:"我"})
match (expert)-[:WORKED_WITH]->(neo:NeoDatabase {name:'Neo4j'})
match path = shortestPath((me)-[:FRIEND*..5]-(expert))
return path,me,expert,neo
** 注意,此过程单个步骤不可重复执行,否则最后输出的node及其多。**
四、列举几个neo4j删除命令:
删除节点之前需先将关系删除
# 删除节点之前先要删除关系
match (me {name:'我'})-[r:FRIEND]-(mf)
detach delete r
match (Amanda {name:'周八'})-[r:WORKED_WITH]->(neo {name:'NeoDatabase'})
detach delete r