neo4j数据库初体验
2020-06-02 本文已影响0人
鸿雁长飞光不度
NEO4j是一款非常好用的开源的图数据库,图数据库的特别擅长处理一些复杂的关联关系,虽然用关系型数据库也能实现,但是关联关系特别复杂的时候不好处理,NEO4J的语法简单,同时NEO4J的查询终端非常友好,能够以关系图的形式呈现结果。结合下面的案例,其实边看边猜大概也能掌握基本语法了。
先创建三个人物
CREATE(yanglin:Person{id:1,name:"车林",gender:"男"})
CREATE(yangbing:Person{id:2,name:"杨冰",gender:"男"})
CREATE(wangyuan:Person{id:3,name:"王媛",gender:"女"})
CREATE(lili:Person{id:4,name:"李丽",gender:"女"})
两个学校
CREATE(qinghua:School{id:2,name:"清华大学"})
CREATE(beijing:School{id:1,name:"北京大学"})
两个公司
CREATE(ali:Company{id:2,name:"阿里巴巴"})
CREATE(tengxun:Company{id:1,name:"腾讯"})
建立一些人物和大学之间的关联关系
MATCH(p:Person) where p.id = 1
MATCH(s:School) where s.id = 1
CREATE (p)-[r:study{year:2012,major:"计算机"}]->(s)
MATCH(p:Person) where p.id = 2
MATCH(s:School) where s.id = 1
CREATE (p)-[r:study{year:2014,major:"电子商务"}]->(s)
MATCH(p:Person) where p.id = 3
MATCH(s:School) where s.id = 2
CREATE (p)-[r:study{year:2012,major:"计算机"}]->(s)
MATCH(p:Person) where p.id = 4
MATCH(s:School) where s.id = 1
CREATE (p)-[r:study{year:2014,major:"电子商务"}]->(s)
建立一些人物和公司之间的关联关系
MATCH(p:Person) where p.id = 1
MATCH(c:Company) where c.id = 1
CREATE (p)-[r:work{job_age:3,job_title:"PHP工程师"}]->(c)
MATCH(p:Person) where p.id = 2
MATCH(c:Company) where c.id = 1
CREATE (p)-[r:work{job_age:2,job_title:"iOS工程师"}]->(c)
MATCH(p:Person) where p.id = 3
MATCH(c:Company) where c.id = 2
CREATE (p)-[r:work{job_age:4,job_title:"商务经理"}]->(c)
MATCH(p:Person) where p.id = 4
MATCH(c:Company) where c.id = 2
CREATE (p)-[r:work{job_age:3,job_title:"Web前端"}]->(c)
添加一下人物的关系
MATCH(p1:Person) where p1.id = 1
MATCH(p2:Person) where p2.id = 2
CREATE (p1)-[r:friend{start:2010}]->(p2)
MATCH(p1:Person) where p1.id = 3
MATCH(p2:Person) where p2.id = 2
CREATE (p1)-[r:friend{start:2011}]->(p2)
上面的Cypher语句比较简单,即是是第一次看到,结合上下文大概也能猜的差不多,但是上面只是添加了一些关系,如果到此位置心里大概有些印象,但是还不是非常直观,那下面这张图来了,这就是添加完后通过Cypher语句查出来的,非常直观吧。这就是图数据库的优点,非常善于关系类数据场景。

下面根据传统的mysql开发的业务自问自答,做一些查询案例。
1.查询所有信息
MATCH(N) RETURN N
会返回上面的那个包含所有节点和关系的图。
2.查询所有人的信息。
MATCH(p:Person) RETURN p
返回所有人物节点和人与人之间的关系。
查询单个人
MATCH(p:Person{name:"李丽"}) RETURN p
- 查询曾经在北京大学上学的人物信息,并且按照入学时间升序排列,取前两位。
MATCH(p:Person)-[r:study]->(s:School)
WHERE s.name = '北京大学'
return p.id,p.name,r.year,s.name
order by r.year asc limit 2

4.查询李丽关系为1步到2步的关联关系
MATCH (p:Person {name:"李丽"})-[*1..2]-(relation)
RETURN p, relation

5.查询李丽和腾讯的最短路径
MATCH path=shortestPath(
(p:Person {name:"李丽"})-[*]-(c:Company {name:"腾讯"})
)
RETURN path
6 .A和B是朋友,并且A和B此时在同一家公司工作,查找符合此条件的人物信息和公司信息。
MATCH(p1:Person)-[r:friend]->(p2:Person),
(p1)-[w1:work]->(c)<-[w2:work]-(p2)
return p1,p2,c

- 统计各个公司对大学毕业生的招聘数量。
MATCH(c:Company)<-[w:work]-(p:Person)-[learn:study]->(s:School)
return c.name,s.name,COUNT(s.name)

8.查看关系最多的人
MATCH(p:Person)-[r]-()
return p.name,COUNT(r) as cnt
order by cnt desc limit 1

9.其他查询
MATCH ()-->() RETURN count(*);//统计所有的关系
MATCH (n) RETURN count(n);//统计所有节点
CALL db.labels() //看所有的标签
CALL db.schema.visualization() //查看节点关系汇总