neo4j cypher - 匹配不存在相同类型的另一个特定节点的节点

neo4j cypher - Match node where another specific node of the same type doesn't exist

背景

我使用以下节点设置了一个 neo4j 数据库;

(:game)-[:teamscore]-(:team)

'game' 节点将包含一个 id、一个 date 和一个 name

'team' 节点 link 将包含一个 id、一个 teamname 和一个 score.

期望的结果

我正在寻找匹配 teamname = "TeamA" 的节点,但仅在 linked 节点不存在于 'game' 的不同团队的情况下。

(简单的英语)

我想要 return 与只有 'TeamA' 得分(且未失球)的比赛相关的所有节点。

到目前为止我有什么

MATCH(g:game)-[:teamscore]-(t:team)
WHERE g.team = "TeamA"
RETURN g, t

我想过在 WHERE 子句中添加某种 NOT (g)-[:teamscore]-(:team),但我不确定如何以不消除我确实想要匹配的节点的方式来做到这一点。

在此先感谢您的帮助!

您可以按名称匹配团队,然后通过指定与该游戏的 teamscore 关系数为 1 来确保只有一个团队链接到该游戏。

MATCH(g:game)-[:teamscore]-(t:team) 
WHERE t.teamname = "TeamA" AND size((g)-[:teamscore]-(:team))=1 
RETURN g, t

因此,如果假设正确,同一场比赛可以有多个(teamA)-[:teamscore]->(game)。

如果是,那么您可以确保从游戏到团队节点的所有连接都是到 teamA。

给定下图:

CREATE (g:Game {id: 1})-[:teamscore]->(:Team {id: 1, name: "TeamA"})
CREATE (g)-[:teamscore]->(:Team {id:2, name: "TeamA"})
CREATE (g)-[:teamscore]->(:Team {id:3, name: "TeamA"})
CREATE (g2:Game {id: 2})-[:teamscore]->(:Team {name: "TeamA"})
CREATE (g2)-[:teamscore]->(:Team {name: "TeamB"})

您可以使用模式理解和 ALL 谓词:

MATCH (n:Game)
WHERE ALL(x IN [(n)-[:teamscore]->(t) | t.name] WHERE x = "TeamA")
RETURN n

它将 return id 为 1 的游戏