当我向已经工作的查询添加可选匹配项时,选择将展开。
我有一个关于游戏中玩家的结构如下 (玩家)-[得到]->(结果)-[在]->(游戏)
当玩家相互对立时,最终数据中的情况会是这样的。 (player_1)-[得到]->(result_1)-[在]->(游戏)<-[在]-(result_2)-[得到]-(player_2)
给定一个result_1id 的列表,我尝试找到相应的result_2
基本查询
MATCH (r:Result)-[:In]->(g:Game)<-[:In]-(or:Result)
WHERE r.id IN [30,32]
RETURN r, or, g, m
返回我所期望的:
(30)-(- G1)-(或1) (32)-(
- G2)-(或2)
但是游戏也可以处于(可选)匹配中,并且此查询
MATCH (r:Result)-[:In]->(g:Game)<-[:In]-(or:Result)
OPTIONAL MATCH (g)<-[:Contains]-(m:Match)
WHERE r.id IN [30,32]
RETURN r, or, g, m
返回
(30)-(- G1)-(或1) (32)-(
- G2)-(或2) (33)-(
- G3)-(或3) (n)-(
- gn)-(orn)
- 无论发生什么其他事情来匹配结构p-r-g-r-p,但不考虑列表[30,32]
我确实怀疑这与数据的镜像性质有关,因为如果我从返回值中删除r,我仍然会得到 (30) 和 (32) 作为或,但我无法弄清楚为什么以及如何停止它。
我试图在可选之前添加一个 With,但这没有区别。
WHERE
子句修改紧接前面的[OPTIONAL] MATCH
或WITH
子句。
您需要移动WHERE
子句,使其紧跟在初始MATCH
之后,以便它按预期限制r
。喜欢这个:
MATCH (r:Result)-[:In]->(g:Game)<-[:In]-(or:Result)
WHERE r.id IN [30,32]
OPTIONAL MATCH (g)<-[:Contains]-(m:Match)
RETURN r, or, g, m