最近翻了很多Neo4j查询语句,但一般讲解如何使用的比较多,讲语法理解的比较少。因此,结合自己自建的知识图谱,对匹配语句的语法做一个简单的解释。
一、知识图谱示例(图书)
如图:
- 图中的知识图谱是两本图书的部分相关属性信息,由若干三元组构成。
- 其中图谱中心香槟色的实体”9787111..."以及左下角香槟色的实体”9787111..."是图书的ISBN号,代表了两本图书,看起来是一样的,实际上是因为圆圈太小了没完全展示。中心的那个实际是: 9787111346883,左下角的那个实际是:9787111475637
二、查询内容及代码详解
我们要查询作者是“詹友刚”,并且所属学科为“材料加工工程”的书籍,在上图里可以发现上述两本图书都是满足的,查询语句示例如下:
MATCH (Author:`作者`{name: '詹友刚' })<-[:被创作]-(Book:ISBN) -[:所属学科]->(Sub:`学科分类`{name:'材料加工工程'}) RETURN Book
代码详解:
1.MATCH:关键字固定写法,意即“匹配”
2.RETURN Book:返回图书Book
注意: 代码中(Book:ISBN),表示用Book代替ISBN,因此返回的是图书的ISBN
3.实体用一对圆括号包起来,比如:
(Author:`作者`{name: '詹友刚' })、(Book:ISBN)、(Sub:`学科分类`{name:'材料加工工程'})
以“(Author:`作者`{name: '詹友刚' })”为例,其中
(1)冒号前面的内容表示给实体类型的别名,可以忽略不写,但返回值就要按原有实体类型来写
即“作者”类型的实体别名是Author,“学科分类”类型的实体别名是Sub
(2)冒号后面的内容由实体类型和实体属性-值对构成,实体属性-值对用一对花括号括起来。
根据下图可以看出,'詹友刚' 属于“作者”类型的实体,并且是“作者”的name。
因此詹友刚这个实体就可以表示为(Author:`作者`{name: '詹友刚' })
4.关系用一对中括号包起来,比如:
[:被创作]、[:所属学科]
注意:这里的“被创作”、“所属学科”指的都是关系类型,我直接是以“关系类型名称”命名“关系名称”的,所以看起来好像我这里写的是关系名称,实际不是。如果不是直接以“关系类型名称”命名“关系名称”的话,比如是“被创作”类型的关系,关系名字为“著作者”,就是这样写的:
[:被创作{name:'著作者'}]
它的冒号前面也可以添加别名,作为关系名的别名。
5、无方向的关系不用加箭头,有方向的关系箭头永远指向实体
- 实体1--关系2,表示无方向
- 关系1->实体2,表示通过关系1,往实体2的方向查询
- 实体a<-关系b,表示如果关系b指向实体a,则往关系b的方向查询
三、查询结果,返回两本书的ISBN所有属性
返回图如下
返回信息如下: