【问题标题】:Neo4j cypher query a known pathNeo4j 密码查询已知路径
【发布时间】:2015-03-31 06:59:45
【问题描述】:

我有一个查询,我不确定如何实现或者在cypher 中执行是否有效。无论如何,这就是我想要做的。

我基本上有这个图表:

我想获取从13 的所有nodes/relationships注意:空节点可以是任意数量的节点)。我还想要所有,如果有,来自最后两个节点的传入边,并且只有最后两个不在原始路径中的节点。在这种情况下,红色的边也应该添加到结果中。

我已经知道我想要的路径。所以在这个例子中,我会得到节点 ID 1, ..., 2, 3,我想我知道如何获取第一部分的路径。

MATCH (n)-->() WHERE n.nid IN ['1', '...', '2', '3'] RETURN n

我只是不知道如何获得路径中最后两个节点的红色边缘。另外,我没有得到节点 ID 4 和 5。我们可以假设连接 1, ..., 2, 3 的边都具有相同的 label,而所有其他边都有不同的 label

我想我需要使用merge,但还不知道怎么做。

或者如果有人知道如何在 gremlin 中执行此操作,我会全力以赴。

【问题讨论】:

    标签: neo4j cypher gremlin


    【解决方案1】:

    这对你有用吗?

    MATCH ({nid: '1'})-[:t*]->(n2 {nid: '2'})-[:t]->(n3 {nid: '3'})
    OPTIONAL MATCH ()-[t42]->(n2)
      WHERE (TYPE(t42) <> 't')
    OPTIONAL MATCH ()-[t53]->(n3)
      WHERE (TYPE(t53) <> 't')
    RETURN COLLECT(t42) AS c42, COLLECT(t53) AS c53;
    

    我将左侧路径(在您的图表中)上的所有关系都指定为type“t”。 (术语label 用于节点,而不是关系。)。你说我们可以假设其他关系没有那个类型,所以这个查询利用这个事实从结果中过滤掉类型“t”的关系。

    此查询还使 4-2 和 5-3 关系可选。

    【讨论】:

    • 这让我更接近我需要的东西,但我遇到了一个问题,即 4-2 之间的关系不存在但 5-3 存在并且查询没有返回任何内容。如果我从查询中删除 4-2 的部分,则返回节点和 rels。看起来这个查询假设 rel 4-2 存在,否则不返回任何内容。有没有办法告诉密码我不在乎那里什么都没有?归还你找到的东西?感谢您的帮助!
    • 我已经更新了我的答案,使 4-2 和 5-3 关系成为可选的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多