如何解决neo4j cypher - 匹配不存在另一个相同类型的特定节点的节点 简单的英文
背景
我有一个设置了以下节点的 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)
,但我不确定如何以不消除我想要匹配的节点的方式执行此操作。
在此先感谢您的帮助!
解决方法
您可以按名称匹配比赛团队,然后通过指定与该游戏的 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
它将返回 ID 为 1 的游戏
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。