【问题标题】:How can I define a Neo4j node property from 2 possible paths with a cypher query?如何使用密码查询从 2 个可能的路径定义 Neo4j 节点属性?
【发布时间】:2021-10-05 15:42:46
【问题描述】:

对于 neo4j/cypher 来说相当陌生。我试图返回一个由 2 个不同路径访问的属性,具体取决于标签,在本例中为 (n) 的标签。

MATCH (k:KeyNode)<-[:BASED_ON]-(n)-[:CONTROLS|:MODIFIES]->()
    WHERE id(k)=123456
    //if label(n) = LabelA
    OPTIONAL MATCH (n)<-[:LABEL_A_REL]-(c:Controller)-[:CONTROLS]->(r:Resource)-[:TYPE_OF]->(rt:ResourceType) 
    //if label(n) = NotLabelA
    OPTIONAL MATCH (n)-[:LABEL_NOT_A_REL]->(r:Resource)-[:TYPE_OF]->(rt:ResourceType) 
    OPTIONAL MATCH (r)-[:PARENT*]->(ro:Room) 
    RETURN ID(r) as resourceId, ID(ro) as siteId, ID(rt) as rt:ResourceType

按原样,路径定义的第一个可选匹配及其定义的节点优先,第二个选择匹配/路径节点重新定义保持不变,我假设因为密码不会重新定义变量。目标是在 2 条可能的路径上找到 (r) 和 (rt)。

我考虑过使用 CASE WHEN 结构,但从文档中我只看到返回单个属性的选项,而不是多个(尽管我可能是错的)

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    这可能是一种方法:

    MATCH (k:KeyNode)<-[:BASED_ON]-(n)-[:CONTROLS|:MODIFIES]->()
        WHERE id(k)=123456
    OPTIONAL MATCH (n)<-[:LABEL_A_REL]-(c:Controller)-[:CONTROLS]->(r1:Resource)-[:TYPE_OF]->(rt1:ResourceType)
    OPTIONAL MATCH (n)-[:LABEL_NOT_A_REL]->(r2:Resource)-[:TYPE_OF]->(rt2:ResourceType)
    
    // COALESCE to deal with precedence
    WITH COALESCE(r1,r2) AS r,
         COALESCE(rt1,rt2) AS rt
    
    OPTIONAL MATCH (r)-[:PARENT*]->(ro:Room)
    RETURN ID(r) as resourceId, ID(ro) as siteId, ID(rt) as rt:ResourceType 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多