2017-08-21 124 views
1

我想匹配所有b1,其中沒有節點b2存在如下所示。 enter image description here 這是某種2跳不對稱。需要注意的是不存在b2必須鏈接到同一個c:Cb1,所以其他(a2) --> (b3) --> (a1)可只要b3沒有邊緣c:C忽略。匹配NOT在Tinkerpop遍歷

我嘗試以下...

graph.traversal().V() 
    .match(
     as("c").hasLabel("C"), 

     as("a").hasLabel("A") 
     .out().hasLabel("B").as("b1") 
     .where(out().as("c")) 
     .out().hasLabel("A").as("a2"), 

     not(
     as("a2") 
     .out().hasLabel("B").as("b2") 
     .where(out().as("c") 
     .out().as("a1") 
    ) 
) 

...但第二場比賽一步拋出異常:

java.lang.IllegalStateException: The provided match pattern is unsolvable: [[MatchStartStep(a1), HasStep([~label.eq(A)]), VertexStep(OUT,vertex), HasStep([~label.eq(B)]), WhereTraversalStep([WhereStartStep, VertexStep(OUT,vertex), WhereEndStep(c)])@[b1], VertexStep(OUT,vertex), HasStep([~label.eq(A)]), MatchEndStep(a2)], [MatchStartStep(a2), HasStep([~label.eq(B)]), WhereTraversalStep([NotStep([WhereStartStep, VertexStep(OUT,edge)])]), WhereTraversalStep([WhereStartStep, VertexStep(OUT,vertex)@[c], VertexStep(OUT,vertex), WhereEndStep(a1)])@[b2], MatchEndStep, MatchEndStep]] 

我甚至無法匹配,這是暗號,很遺憾。

回答

1

突然,我發現這避免範圍問題的解決方案:

graph.traversal().V() 
    as("a").hasLabel("A") 
    .out().hasLabel("B").as("b1") 
    .where(out().hasLabel("C")) 
    .out().hasLabel("A").as("a2") 
    .where(
     not(
      out().hasLabel("B") 
       .where(out().hasLabel("C")) 
       .out().as("a") 
     ) 
    )