在 Tinkerpop 遍历中匹配 NOT
Match NOT in Tinkerpop traversal
我想匹配所有 b1
,其中不存在节点 b2
,如下所示。
这是某种 2 跳不对称。注意不存在b2
必须link与b1
相同c:C
,所以其他(a2) --> (b3) --> (a1)
可以只要 b3
与 c:C
.
没有优势,就会被忽略
我尝试了以下...
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]]
不幸的是,我什至无法匹配这是 Cypher。
突然,我找到了一个避免范围问题的解决方案:
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")
)
)
我想匹配所有 b1
,其中不存在节点 b2
,如下所示。
b2
必须link与b1
相同c:C
,所以其他(a2) --> (b3) --> (a1)
可以只要 b3
与 c:C
.
我尝试了以下...
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]]
不幸的是,我什至无法匹配这是 Cypher。
突然,我找到了一个避免范围问题的解决方案:
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")
)
)