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

Posted

技术标签:

【中文标题】neo4j cypher - 匹配不存在相同类型的另一个特定节点的节点【英文标题】:neo4j cypher - Match node where another specific node of the same type doesn't exist 【发布时间】:2020-12-30 22:01:24 【问题描述】:

背景

我有一个包含以下节点的 neo4j 数据库;

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

“游戏”节点将包含一个id、一个date 和一个name

“团队”节点链接将包含一个id、一个teamname 和一个score

期望的结果

我正在寻找匹配 teamname = "TeamA" 的节点,但只匹配不存在与该“游戏”不同团队的链接节点的节点。

(简单英语)

我想返回与只有“TeamA”得分(且未失球)的比赛相关的所有节点。

到目前为止我所拥有的

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

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

提前感谢您对此的任何帮助!

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

鉴于以下图表:

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

它将返回 ID 为 1 的游戏

【讨论】:

以上是关于neo4j cypher - 匹配不存在相同类型的另一个特定节点的节点的主要内容,如果未能解决你的问题,请参考以下文章

neo4j cypher 节点可以模糊匹配么

编写不区分大小写的Cypher查询以匹配Neo4j中字符串的开头

neo4j 密码匹配命令连接

如何优化Neo4J Cypher查询?

如何优化 Neo4J Cypher 查询?

Neo4j Cypher 复杂查询优化