【问题标题】:neo4j cypher - Match node where another specific node of the same type doesn't existneo4j cypher - 匹配不存在相同类型的另一个特定节点的节点
【发布时间】: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),但我不确定如何以一种不会消除我想要匹配的节点的方式做到这一点。

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

【问题讨论】:

    标签: neo4j cypher


    【解决方案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 的游戏

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多