1MATCH
1.1作用
MATCH是Cypher查询语言中用于从图数据库中检索数据的关键字。它的作用是在图中查找满足指定条件的节点和边,并返回这些节点和边的属性信息。
在MATCH语句中,通过节点标签和边类型来限定查找范围,然后通过WHERE语句来筛选符合条件的节点和边。最后,通过RETURN语句返回查询结果中的属性信息。
1.2语法规则
MATCH (node1:Label1)-[edge:RELATIONSHIP]->(node2:Label2)
WHERE <condition>
RETURN <expression>
- Label1/ Label2表示节点的标签
- node1和node2是节点变量,可以用来引用节点的属性信息
- RELATIONSHIP表示边的类型
- edge是边变量,可以用来引用边的属性信息
- 是可选的查询条件,可以用来筛选满足条件的节点和边
- 是要返回的属性信息
在MATCH语句中,通过节点标签和边类型来限定查找范围,然后通过条件语句来筛选符合条件的节点和边。最后,通过RETURN语句返回查询结果中的属性信息。
1.3查询示例
假设我们有一个拥有Person和City两种标签的图数据库,其中Person节点有name、age和gender属性,City节点有name和population属性,它们之间的关系是Person节点居住在City节点中。我们要查找居住在人口大于100万的城市中女性的姓名和年龄。
MATCH (person:Person)-[:LIVES_IN]->(city:City)
WHERE city.population > 1000000 AND person.gender = 'F'
RETURN person.name, person.age
2OPTIONAL MATCH
2.1作用
在Cypher中,OPTIONAL MATCH用于查找可能匹配但不是必须的模式。这意味着,如果匹配失败或者找不到匹配的节点、关系或路径,OPTIONAL MATCH语句不会导致整个查询失败。相反,它将返回一个空结果。
2.2语法规则
OPTIONAL MATCH (node1:Label1)-[edge:RELATIONSHIP]->(node2:Label2)
2.3查询示例
//查找节点及其关系,如果关系不存在则返回空结果
MATCH (a:User)
OPTIONAL MATCH (a)-[r:RELATION]->(b)
RETURN a, r, b
例如如下所示,我们当我们使用OPTIONAL MATCH (a)-[r:RELATION]->(b) ,查询时,由于这里的RELATION是可选的匹配,因此,该关系就是,有就返回,没有就返回null,但是对于 (a:User) 则会全量返回,而对于 (b) 而言,因为b节点是通过关系查找的,因此如果关系不存在,那么这里的b节点一样也返回null。
提问:明明只有西子->念念、西子->老司、老司->念念这三个关系为RELATION,为什么上图中把西子->小跟班的老公关系也带出来?
这里其实不是RELATION查询出来的,而是MATCH (a:User)中,包含了西子,和小跟班,西子的老公是小跟班,然后用Neo4j来默认渲染上的拓扑节点。
我们实际查看数据的时候,可以看到返回的table中,西子和小跟班之间是没有找到关系,这是因为西子和小跟班之间的关系是老公,不是RELATION,所以用RELATION查询,是没有关系的,但是Neo4j在绘制拓扑图的时候会按照老公的关系,进行绘制。
这里我们做两个试验查询即可
//查询西子和小跟班,并没有查询他们的关系,返回的实际数据中,也没有两人的关系,但是确实neo4j绘制了拓扑图
MATCH (a:User{userName:'小跟班'}),(b:User{userName:'西子'}) RETURN a,b
而小跟班和念念没有建立关系,因此把西子改成念念以后,他们就变成两个孤立的点
因此得出一个结论,当neo4j返回的节点A和B,如果节点A和B本身具有关系,那么neo4j会自动把关系给补上
这里我们返回名称,用表格的关系来查看,就能看到如下所示,没有的值则是null,我们可以使用**type()**这个方法来查看关系类型
//查找节点及其关系,如果关系不存在则返回空结果
MATCH (a:User)
OPTIONAL MATCH (a)-[r:RELATION]->(b)
RETURN a.userName,type(r),r.nane, b.userName
2.4对比MATCH
OPTIONAL MATCH查询比MATCH多了一个OPTIONAL,那么我们把OPTIONAL删除掉来看看效果
//查找节点及其关系,如果关系不存在则返回空结果
MATCH (a:User) OPTIONAL MATCH (a)-[r:RELATION]->(b) RETURN a, r, b
//如果我们把OPTIONAL去掉,那么会发生什么效果?
MATCH (a:User) MATCH (a)-[r:RELATION]->(b) RETURN a, r, b
不难发现,只保留了RELATION关系的节点,没有RELATION关系的节点都没了
同样的查看表格数据,我们发现,确实只有RELATION,也就是有就有,没有就没有,没有就不返回了,由于没有返回节点,因此neo4j也没办法使用默认关系来绘制关系图
MATCH (a:User) MATCH (a)-[r:RELATION]->(b) RETURN a.userName,type(r),r.nane, b.userName
3RETURN
3.1作用
在Neo4j中使用Cypher查询语言,RETURN 关键字用于指定查询的结果集。查询的结果集可以是节点、关系、属性或一组这些元素的组合。
查询中的 RETURN 子句指定了查询返回的结果,可以返回节点、关系、属性、子图等。例如,可以使用 RETURN 显示特定节点的属性,也可以使用 RETURN 显示已匹配的节点和关系的子图。
使用 RETURN 子句的查询会返回一个结果集,这个结果集可以在Neo4j中进行进一步的处理,如排序、筛选、分组等。同时,RETURN 子句也可以与其他Cypher子句一起使用,如 MATCH 和 WHERE 等,以实现更复杂的查询操作。
3.2语法规则
RETURN <expression>
显示所有节点
MATCH (n) RETURN n
显示特定节点和它的标签
MATCH (n:Label) RETURN n, labels(n)
显示节点、关系和属性
MATCH (n)-[r]->(m) RETURN n, r, m
返回最短路径
MATCH p=shortestPath((a)-[r:REL_TYPE*]->(b)) RETURN p
显示节点计数
MATCH (n) RETURN count(n)
在Cypher中,RETURN 还允许你选择使用聚合函数,如 COUNT,SUM,MIN,MAX 和 AVG 等。
4WITH
4.1作用
在Neo4j中,WITH 关键字用于将查询结果传递到下一个查询中,并将其作为输入数据。WITH 关键字可以将查询分为多个部分,并允许在这些部分之间传递数据。
4.2使用场景
WITH 子句通常用于以下几种情况:
1为表达式求值结果引入新变量
MATCH (george {name: 'George'})<--(otherPerson)
WITH otherPerson, toUpper(otherPerson.name) AS upperCaseName
WHERE upperCaseName STARTS WITH 'C'
RETURN otherPerson.name
2查询分割:您可以使用WITH子句将一个查询分成几个部分,以便执行更复杂的操作。
例如,以下查询将找到所有与Alice有共同朋友的人,然后计算每个人有多少个共同朋友
MATCH (alice:Person {name: 'Alice'})-[:FRIEND]->(commonFriend:Person)<-[:FRIEND]-(person:Person)
WITH person, count(commonFriend) as numCommonFriends
RETURN person.name, numCommonFriends
3聚合:WITH子句还可以用于聚合数据。
例如,以下查询将计算每个标签的出现次数:
MATCH (n)
UNWIND labels(n) as label
WITH label, count(*) as count
RETURN label, count
在WITH子句中,还可以使用DISTINCT关键字来确保结果集中没有重复项,以及ORDER BY子句来对结果集进行排序