赞
踩
图数据库专门用于查询两点之间的关系及其属性,比如查询出一个人的好友、以及好友的好友。用传统的MySQL等关系型数据库就比较耗性能或者需要复杂的查询语句了。
我们在做技术选型的时候,看一下图数据库排行榜:
如上图所示,Neo4j一骑绝尘。当然排名较高也可能是由于比较旧,也要看一下其他的数据库。比如国产的Nebula Graph据说就很牛逼,看官网上介绍国内的很多大厂都在用它,性能也甩Neo4j一条街。但笔者搜索了一下,网上的资料教程基本是其营销号的文章。考虑到我们的需求,稳妥起见,还是选择了Neo4j。
打开Neo4j官网,可以看到在沙盒中体验的选项,先用快速上手玩一下。当然过程需要注册账号就不说了。
选择一个示例数据库Movies
,里面有电影、演员、导演及其之间的关系数据:
在浏览器中打开管理工具:
进去后左侧栏有个教程,教你一步步使用CQL查询语句:
Match (m:Movie) where m.released > 2000 RETURN m limit 5
上述查询将返回2000年以后发行的5部电影。
添加名字叫John Doe
的人物:
Create (p:Person {name: 'John Doe'}) RETURN p
节点
节点表示实体。图形数据库中的节点类似于关系数据库中的行。
关系
两个节点可以与关系连接。
查询所有执导 2010 年后上映电影的导演:
MATCH (p:Person)-[d:DIRECTED]-(m:Movie) where m.released > 2010 RETURN p,d,m
结果如下(有三个导演执导了电影Cloud Atlas):
查询所有在 2010 年之后上映的电影演员:
MATCH (p:Person)-[d:DIRECTED]-(m:Movie) where m.released > 2010 RETURN p,d,m
标签
标签是节点或关系的名称或标识。
返回20个标签为Person
的节点。
MATCH (p:Person) RETURN p limit 20
返回20个任意类型的节点。
MATCH (n) RETURN n limit 20
属性
节点和关系可以有属性,形式为键值对。
查询电影属性(标题和发行年份):
MATCH (m:Movie) return m.title, m.released
查询人物属性(姓名和出生年份):
MATCH (p:Person) return p.name, p.born
查询名字叫Tom Hanks
的人:
Match (p:Person {name: 'Tom Hanks'}) RETURN p
或
MATCH (p:Person) where p.name = "Tom Hanks" RETURN p
更多where语句请查看手册
查询2010年至2015年间发行电影
MATCH (m:Movie) where m.released > 2010 and m.released < 2015 RETURN m
Merge语句用于:
MERGE (p:Person {name: 'John Doe'})
ON MATCH SET p.lastLoggedInAt = timestamp()
ON CREATE SET p.createdAt = timestamp()
Return p
上述代码将查询姓名为John Doe
的人,如果有则设置其lastLoggedInAt
属性为当前时间戳;没有则创建,并设置其createdAt
属性为当前时间戳。
MERGE (m:movie {title: 'Greyhound'})
ON MATCH SET m.lastUpdatedAt = timestamp()
ON CREATE SET m.released = "2020", m.lastUpdatedAt = timestamp()
Return m
上述代码将查询title
为Greyhound
的电影,如果有则设置其lastUpdatedAt
属性为当前时间戳;没有则创建,并设置其,released
属性为2020
,以及lastUpdatedAt
属性为当前时间戳。
关系连接两个节点
比如,下面语句查询姓名为Tom Hanks
的人,标题为Cloud Atlas
的电影,创建一个关系为WATCHED
,表示已看该电影。返回关系类型。
MATCH (p:Person), (m:Movie)
WHERE p.name = "Tom Hanks" and m.title = "Cloud Atlas"
CREATE (p)-[w:WATCHED]->(m)
RETURN type(w)
在Neo4j中,可以有两种关系:输入和输出。
上面图片中,可以说,Tom Hanks
有一个输出关系->
,而Cloud Atlas
有一个输入关系<-
。关系是有方向的。
然而在一些情况下,输入输出关系并不重要,所以以下语句等效:
MATCH (p:Person)-[r:ACTED_IN]->(m:Movie) RETURN p,r,m
MATCH (p:Person)-[r:ACTED_IN]-(m:Movie) RETURN p,r,m
Cloud Atlas
:MATCH (m:Movie {title: 'Cloud Atlas'})<-[d:DIRECTED]-(p:Person) return p.name
Tom Hanks
合作演出过的人:MATCH (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(:Movie)
<-[:ACTED_IN]-(p:Person) return p.name
Cloud Atlas
有关的人以及与电影关系:MATCH (p:Person)-[relatedTo]-(m:Movie {title: "Cloud Atlas"}) return p.name, type(relatedTo)
查询Tom Hanks
有关的电影以及人物关系
MATCH p=(p1:Person {name: 'Tom Hanks'})-[r]->(m)<-[r1]-(p2) return p
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。