可选匹配扩展查询

时间:2019-04-17 21:29:05

标签: neo4j cypher

当我向已经运行的查询中添加可选匹配项时,选择范围就会扩大。

关于游戏玩家的结构如下 (玩家)-[获得]->(结果)-[参与]->(游戏)

当玩家互相反对时,最终数据中的内容将看起来像这样 (player_1)-[got]->(result_1)-[in]->(游戏)<-[in]-(result_2)-[got]-(player_2)

给出一个结果_1 ID的列表,我试图找到相应的结果_2

基本查询

MATCH (r:Result)-[:In]->(g:Game)<-[:In]-(or:Result)  
WHERE r.id IN [30,32] 
RETURN r, or, g, m

完全返回我的期望:

  1. (30)-(g1)-(or1)
  2. (32)-(g2)-(or2)

但是游戏也可以(可选)匹配,并且可以查询

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

返回

  1. (30)-(g1)-(or1)
  2. (32)-(g2)-(or2)
  3. (33)-(g3)-(or3)
  4. (n)-(gn)-(orn)
  5. 任何其他与结构p-r-g-r-p匹配但与列表[30,32]无关的

我确实怀疑这与数据的镜像性质有关,因为如果我从返回的值中删除 r ,我仍然会以的形式返回(30)和(32)或,但我无法弄清楚为什么以及如何阻止它。

我试图在可选选项之前添加一个With,但是没有区别。

1 个答案:

答案 0 :(得分:2)

WHERE子句修改紧接的[OPTIONAL] MATCHWITH子句。

您需要移动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