【问题标题】:How to match records that meet multiple and indirect relationships in neo4j?neo4j中如何匹配满足多重间接关系的记录?
【发布时间】:2020-07-06 22:05:23
【问题描述】:

我搜索并找到了一些类似的案例,但不是我想要的。

例如节点“玩家”有以下关系

Players -> Has_Racket 
Players -> Has_Balls

Balls -> Has_TennisBall
Balls -> Has_BasketBall
Balls -> Has_VolleyBall
Balls -> Has_PingPongBall
Balls -> ... ...

Player 和 Balls 之间没有直接关系。这让我很难查询。

一名球员可能没有球,一名球员可能只有一种类型的球,或者一名球员可能拥有多种类型的球。

我想找到所有有网球和篮球但没有排球的球员。而且我必须使用关系“Players -> Has_Balls”。

谢谢。

【问题讨论】:

  • 您的数据模型不清楚。你的node labelsrelationship types 是什么?你的节点和关系有什么属性?另外,你可以修改你的数据模型吗?

标签: neo4j relationship


【解决方案1】:

根据您的模型,我将使用以下查询来获取所有有网球和篮球但没有排球的球员

MATCH (p:Player)
WHERE (p)-[:Has_Balls]->()-[:Has_TennisBall]->()
AND (p)-[:Has_Balls]->()-[:Has_BasketBall]->()
AND NOT (p)-[:Has_Balls]->()-[:Has_VoleyBall]->()

【讨论】:

    【解决方案2】:

    感谢您的回复,这很有帮助。但我不得不承认我在第一篇文章中犯了一个错误。实际准确的情况是这样的

    Players -> Has_Racket 
    Players -> Has_Balls
    
    Balls -> Has_Types 
    
    {"description": "Base_Ball", "value": "Base Ball"}
    {"description": "Tennis_Ball", "value": "Tennis Ball"}
    {"description": "Basket_Ball", "value": "Basket Ball"}
    

    我需要查询有棒球和网球但没有篮球的球员。

    【讨论】:

      【解决方案3】:

      假设您想在不重写查询的情况下切换球类型,我想您可以这样做

      // here in the WITH, but you could use parameters as well
      
      WITH ['Base Ball','Tennis Ball'] AS shoulds,
           ['Basket Ball'] AS shouldnots
      
      MATCH (p:Player)
      WITH p,[(p)-[:Has_Balls]->()-[:Has_Types]->(type) | type.value] AS balltypes
      WHERE NONE(b IN balltypes WHERE b IN shouldnots)
            AND ALL(b IN balltypes WHERE b IN shoulds)
      RETURN p
      
      

      【讨论】:

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