【问题标题】:Neo4j Cypher alternative pathsNeo4j Cypher 替代路径
【发布时间】:2015-04-06 21:05:20
【问题描述】:

我正在使用 Cypher,我需要构建一个类似下面的查询

(A) ----e1----(B)
   \           |
     \         |
       e3      e2
         \     |
           \   |
             (C)

其中 A、B 和 C 是节点,e1、e2 和 e3 关系分别连接 A 和 B、B 和 C 以及 A 和 C。

我感兴趣的是节点 A 和 C。当 e1、B 和 e2 存在(并尊重某些属性)或关系 e3 存在(并尊重某些属性)或两者都存在时,此模式应该匹配。我的问题是我无法将其转换为 Cypher 语言。 为了给关系一个标识符,我需要在 MATCH 子句中指定它,比如

MATCH (A)--[e1]--(B)--[e2]--(C), (A)--[e3]--(C)

但是这样做我是在告诉 Neo4j 我希望 (e1 和 e3) 和 e2 都存在,但事实并非如此。但如果我不给这些关系一些标识符,我就无法搜索它们的任何属性。

如何构建此查询?

谢谢。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    这是一个查询,应该在每一行中返回一个不同的 A 和它所连接的所有不同的 C 节点的集合,以您所说的一种(或两种)方式。

    我假设ABC 都是节点标签。

    为了清楚地展示该方法,这是一个不查看属性值的简化查询

    MATCH p=(a:A)-[e*1..2]-(c:C)
    WITH p, a, c, RELATIONSHIPS(p) AS rels
    WHERE LENGTH(rels) = 1 OR HEAD(TAIL(NODES(p))):B
    RETURN a, COLLECT(DISTINCT c) AS cs
    

    为了对属性值执行测试,您需要修改WHERE 子句中的两个术语(在OR 的任一侧)。我希望这很清楚。

    【讨论】:

    • 我非常专注于寻找一种方式来表达“这个存在或这个存在”,我什至没有想过只是“折叠”路径 e1-e2 和边缘 e3 在同一个元素,然后使用 WHERE 子句来识别它们。尽管我制作的示例过于简化了我的问题,但我还是设法将我能想象到的所有其他示例都带到了您制作的架构中。谢谢! =)
    • 不客气。我还简化了WHERE 子句中的第二个术语。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多