2015-03-31 109 views
0

我有一个查询,我不确定如何实施或者如果在cypher中有效。无论如何,这是我想要做的。Neo4j密码查询已知路径

我基本上是这样的图:

Example Graph

我想所有的nodes/relationships13:空节点可以是任意数量的节点)。我也想要所有的(如果有的话),来自最后两个节点的入边和只有最后两个不在原路径中的节点。在这种情况下,也应该添加红色的边缘。

我已经知道我想要的路径。所以在这个例子中,我会给节点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中做到这一点,我全部都是耳朵。

回答

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关系成为可选项。

+0

这让我更接近我需要的东西,但是我遇到了4-2之间的关系不存在但是5-3之间的关系并没有从查询返回的问题。如果我从查询中删除4-2的部分,则返回节点和rels。看起来这个查询假设rel 4-2在那里,否则不会返回任何东西。有没有告诉密码的方法,我不在乎它是否在那里;返回你找到的东西?谢谢您的帮助! – Jeff 2015-03-31 17:41:14

+0

我已更新我的答案,使4-2和5-3关系可选。 – cybersam 2015-03-31 18:30:27