返回某种关系类型的图表(具有最大搜索深度限制)

时间:2018-01-19 13:55:02

标签: neo4j cypher

假设我有两个节点并想在它们之间找到路径,我可以使用以下密码。

MATCH(a{ActivityId:"abc"}),(b{ActivityId:"def"}),p=((a)-[x *..15]->(b)) 
return p

如果我希望将路径限制为具有某些属性的路径,例如x.special=true,我将如何实现这一目标?

具体来说,此查询给出了结果(没有最大长度限制)

MATCH(a{ActivityId:"A3040", ProjectId:"AB.BC"}),(b{ActivityId:"HNP-L0-CON2-A1190",ProjectId:"AB.BC"}),p=((a)-[*{Critical:true}]->(b)) 
RETURN p

虽然这不是

MATCH(a{ActivityId:"A3040", ProjectId:"AB.BC"}),(b{ActivityId:"HNP-L0-CON2-A1190",ProjectId:"AB.BC"}),p=((a)-[xs*..15]->(b))
WHERE all(x IN xs WHERE x.Critical)
RETURN p

3 个答案:

答案 0 :(得分:3)

这三种方法都应该有效:

  1. MATCH p=((a {ActivityId: "A3040", ProjectId:"AB.BC"})-[*..15 {Critical: true}]->(b {ActivityId:"HNP-L0-CON2-A1190", ProjectId:"AB.BC"}))
    RETURN p
    
  2. MATCH p=((a {ActivityId: "A3040", ProjectId:"AB.BC"})-[*..15]->(b {ActivityId:"HNP-L0-CON2-A1190", ProjectId:"AB.BC"}))
    WHERE ALL(r IN RELATIONSHIPS(p) WHERE r.Critical)
    RETURN p
    
  3. MATCH p=((a {ActivityId: "A3040", ProjectId:"AB.BC"})-[xs *..15]->(b {ActivityId:"HNP-L0-CON2-A1190", ProjectId:"AB.BC"}))
    WHERE ALL(r IN xs WHERE r.Critical)
    RETURN p
    

答案 1 :(得分:2)

您可以在关系中使用all predicate

MATCH p=((a {ActivityId: "abc"})-[*..15]->(b {ActivityId:"def"}))
WHERE all(n IN nodes(p) WHERE n.Critical)
RETURN p

答案 2 :(得分:1)

您可以使用length功能过滤结果。

  

length()返回路径的长度。

MATCH (a{ActivityId:"A3040", ProjectId:"AB.BC"})
  ,(b{ActivityId:"HNP-L0-CON2-A1190",ProjectId:"AB.BC"})
  ,p=((a)-[*{Critical:true}]->(b))
WHERE length(p) < 15
RETURN p