我想编写密码,我想打印路径中的节点到某个节点。在某个节点之后,我不想比较和打印节点。
例如
D{type:"fresh"} ---childOf--->C{type:"dirty"}----childOf---->B{type:"fresh"}-----childOf----->A{type:"fresh"}
G{type:"fresh"} ---childOf--->F{type:"fresh"}----childOf---->E{type:"dirty"}-----childOf----->A{type:"fresh"}
A 是根。
一(
我想要 o/p,这样一旦我在任何列表中获得脏节点,我想停止比较和我的 o/p 是脏节点的路径。所以在这种情况下,o/p 是
c->B->A
&
E->A
D 被删除,因为 C 是脏的F&G被移除,因为E是脏的。
b( 在第二种情况下,我也不想要脏节点,所以 o/p 更改为
B->A
& 一个
注意:在这两种情况下,根可能是脏的,仍然 o/p 应该保持不变。所以换句话说,根的类型并不重要。O/p 与根的类型无关。
没有办法使用 Cypher 完成您想要的(当您点击此属性时停止遍历,同时忽略开始节点(。我所知道的所有解决方案都将超越"脏"节点,需要过滤,这可能对你有用,因为它们会给出正确的答案,即使遍历不是最有效的。
假设您使用 :Node 作为标签,并使用字母作为名称属性,并且您在 :Node(name( 上有一个索引来快速查找启动节点,则此查询应该有效:
MATCH path=(:Node{name:'A'})<-[:childOf*]-({type:'dirty'})
WITH path
WHERE single(node in tail(nodes(path)) WHERE node.type = 'dirty')
RETURN nodes(path)[..-1] as nodes
如果可以选择使用 :D irty 标签而不是属性,那么有一种方法可以使用 APOC 过程执行此操作,一旦我们到达具有相关标签的节点,就会停止遍历。