Neo4j入门(六)从计算节点的出度、入度开始
共 1239字,需浏览 3分钟
·
2021-11-29 01:59
本文将会介绍一些较高级的Neo4j查询Cypher语句,先从计算节点的出度、入度开始。
在此之前,我们先构建一个简单的电影知识图谱。
图谱构建
我们将构建一个IMDB排名前250的电影知识图谱,其数据来源可访问网址:https://www.imdb.cn/imdb250/6,电影数据示例如下:
其中节点的Schema如下:
节点类型 | 属性 |
---|---|
Movie | name,language,releaseDate,minutes |
Person | name |
Country | name |
Genre | name |
其中Movie为电影节点,Person为人物节点,包含导演、编剧、主演,Country为国家或地区,Genre为电影类型。关系Schema如下:
头结点 | 尾结点 | 关系 | 备注 |
---|---|---|---|
Movie | Person | director | 电影的导演 |
Movie | Person | editor | 电影的编剧 |
Movie | Person | actor | 电影的主演 |
Movie | Country | country | 电影所属国家或地区 |
Movie | Genre | has | 电影类型 |
根据上述数据源及Schema,我们构建的电影图谱示例如下:
Cypher查询
查询节点的出度、入度
首先我们查询某个节点的出度
,比如我们想知道肖申克的救赎的出度
(即有多少关系以该节点为头结点),则可以使用如下查询语句:
match (n:Movie{name: '肖申克的救赎'}) with n, size((n)-[]->()) as s return s;
返回结果如下:
s
9
如果我们想查询某个节点的入度
,比如我们想知道前250部电影中有多少部是美国拍的
,则可以使用如下查询语句:
match (n:Country{name: '美国'}) with n, size((n)<-[]-()) as s return s;
返回结果如下:
s
186
匹配多种关系
接下来我们查询多种关系,比如我们想知道阿甘正传的导演及电影类型
,则可以使用如下查询语句:
match p=(n:Movie{name: '阿甘正传'}) -[r:director|has] -> (m) return p;
返回结果如下图:
匹配多种类型节点
匹配多种类型的节点时,不像匹配多种关系使用|那么方便,比如我们想知道图谱中的电影及国家
,则可以使用如下查询语句:
match (n) where n:Movie or n:Country return n.name;
限定条件的节点出度、入度
比如我们想知道肖申克的救赎的主演和导演数量
,则可以使用如下查询语句:
match (n:Movie{name: '肖申克的救赎'}) with n, size((n)-[:actor|director]->()) as s return s;
返回结果如下:
s
6
又比如我们想知道一共有多少部剧情片和爱情片
,则可以使用如下查询语句:
match (n:Genre) where n.name = '剧情' or n.name = '爱情' with n, size((n)<-[]- ()) as s return n.name, s;
返回结果如下:
n.name s
"爱情" 15
"剧情" 116
按节点出度、入度排序
比如我们想按照国家所拍摄的电影数量对国家排序
,即对国家节点按出度进行排序
,则可以使用如下查询语句:
match (n:Country) with n, size((n)<-[]-()) as s order by s desc return n.name, s;
则返回结果如下:
改变节点的标签
Neo4j是支持对同一节点赋予多个标签(label)的,那么我们尝试着对拥有director、editor、actor关系的Person节点再给它们赋予Director、Editor、Actor标签,查询语句如下:
match (n:Movie) -[r:director]->(m:Person) set m:Director return (m);
如下图:
有了上述操作,我们就可以知道那些
即是导演又是编剧又是主演的人
了,查询语句如下:match (n) where n:Director and n:Editor and n:Actor return (n);
返回结果如下:
去百度查询特瑞·琼斯,也是符合我们的搜索结果的:
总结
从上面的查询中我们可以看到,知识图谱可以告诉我们很多有趣的事实,这也是图谱的魅力所在~
本文将会介绍了一些较高级的Neo4j查询Cypher语句,感谢阅读~