详细一点的介绍,就看这两个好的的博客图数据库之Cypher语言、图数据库-Neo4j介绍与Cypher入门
Neo4J3.0官方使用手册请点击Neo4J3.0官方使用手册
Neo4J3.0官方开发手册请点击Neo4J3.0官方开发手册
Cypher-Neo4J3.0使用手册请点击Cypher-Neo4J3.0使用手册
学习资源都在上面,下面进入正题
前面一直没搞清楚什么是图数据库,我一直以为是存储图片的数据库【哭死。。。。。】后来才知道,这个图不是图片,是一种数据结构,图。。。只怪自己上课不曾好好听讲。。。
**
Talk is cheap,Show you the code!
**
在图数据库中,节点就类似于我们的一般数据库的表(可能这个说法是错误的。。。这是我自己认为的),因为,我还没发现Neo4J 里面有表的概念,或者类似的概念存在,就是说,如果数据量大了以后,管理人员一定要记住,某个节点的属性,或者关系属性,不然找一个节点,无比麻烦。。。看的眼花缭乱,或许是应为刚学,不会使用Cypher吧,show一把Neo4j里面的select * 就是 match (n) return n;
如果用官方的可视化插件,是长这样的:
如果是从终端里面看,大概是这样的
以上的还是只有三百多个节点,如果成千上万条。甚至几十万条,简直爆炸,难以想象,眼花缭乱
好吧,先声明一点哈,俺是一个学生,见识少,有些理论只是个人的一孔之见,望各位大大海涵,指正哈
废话少说,让我们开启Neo4j的HelloWorld!
一、创建节点:
我要创建四个人,张三。李四、王五、赵六
create(Lisi:Person{name:'Lisi',born:1996,sex:'男',school:'四江'}),(Wangwu:Person{name:'Wangwu',born:1995,sex:'男',school:'三江'}),
(Zhangsan:Person{name:'Zhangsan',born:1995,sex:'男',school:'三江'}),(Zhaoliu:Person{name:'Zhaoliu',born:1997,sex:'男',school:'四江'})
return Lisi,Zhangsan,Zhaoliu,Wangwu
这是官方的create语句:
解释一下哈:
create (n:Person{name:'aaa',age:1,....})
这是创建一个节点
n:是这个语句中暂时用的节点名字,可以随意取,只在这句话中生效!只有一次哈,Neo4j里面的名字,真的就像临时代号一样,过期作废。具有时效性。
Person:这是节点的标签,我感觉就像一个节点的名字,这个是永久生效的,这也是在茫茫节点中找一个节点的主要依据,不过标签也可以有多个
{name:'aaa',age:1,....}:{}里面存放的是节点的属性,这就是用来区分每一个节点,就像,就像有两个人,甲叫张三,乙也叫张三,我怎么知道我要找的是甲还是乙呢?后来我再说是升高一米七,体重一百七的,等等特征,来区分分甲乙,一个节点的属性可以有多个
有了节点,就要有节点之间的关系了。
二、创建节点之间的关系:
有个四个人,我就要编排他们的关系了,哈哈哈
match (a:Person{name:'Lisi'}),
(b:Person{name:'Zhangsan'}),
(c:Person{name:'Zhaoliu'}),
(d:Person{name:'Wangwu'})
merge (a)-[r:friend]->(b)-[t:lover]->(c)
merge (a)-[y:friend]->(d) return r,t,y
四个人,我说张三和李四是朋友,张三和赵六是恋人,李四和王五是朋友
match :我感觉match就是sql里面的select ... where ... 的集合体,官方称之为模式匹配
merge: 也是创建,和create类似,不同的是,merge创建时,要先查询,该节点。关系,是否存在,若存在就返回该节点。关系,如果没有就创建新的。这就避免了创建重复的节点、关系(如果是增加关系,我建议使用merge而不是create)
下方是官方的match和merge例子:
3、补充关系
这四个人有一个属性,叫做学校,那我给他们创建一个叫做校友的关系
match (a:Person),(b:Person) where a.school=b.school (a)-[r:alumnus]->(b) return r
Cypher支持where ,等其他SQL中的东西,具体的可以看博客最上面推荐的两篇博客
这时,我发现,自己和自己是校友,是个什么鬼?!
三、删除关系
好吧,是时候删除这该死,愚蠢,荒诞的关系了
match (a)- [r:alumnus]->(b) delete r
看来必须申明节点a,b不是同一个节点了
match (a:Person),(b:Person) where a.school=b.school and a.name<>b.name merge (a)-[r:alumnus]->(b) return r
<>:我发现貌似Cypher貌似不支持!=,所以只能用<>
四、修改节点属性
我突然发现赵六和张三这对恋人都是男的。。。。。是时候让赵六做变性手术去了
match (a:Person) where a.name='Zhaoliu' set a.sex='女' return a
好了看看最终成果吧
这里还有很多不足的,比如说,恋人朋友,应该是两个认得事,怎么能只有一个箭头呢。。。。Neo4J貌似不支持双向箭头。。。。我也没研究到。。。
这只是Neo4J的简单应用,哈哈哈哈,具体的,详细的请看最上面推荐的博客,资料。