Neo4j 基于关系参数排除关系

Neo4j 基于关系参数排除关系,neo4j,cypher,Neo4j,Cypher,我有一个neo4j密码遍历问题 设置: 我有一个从节点“a”开始的查询,它给出了所有具有关系“FOO”的路径。所有这些“FOO”关系都有一个参数“BAR”。参数“BAR”可以有2个(或更多)值“1”和“2”。现在我想排除包含一个或多个FOO.BAR=“2”关系的所有路径 查询:START a=node(x)MATCH a-[rh:FOO*]->b RETURN rh; rh提供了所有可能的路径,但我不知道如何添加关于关系的标准 我在控制台()中创建了一个场景 创造 (a{name:“a”}),

我有一个neo4j密码遍历问题

设置: 我有一个从节点“a”开始的查询,它给出了所有具有关系“FOO”的路径。所有这些“FOO”关系都有一个参数“BAR”。参数“BAR”可以有2个(或更多)值“1”和“2”。现在我想排除包含一个或多个FOO.BAR=“2”关系的所有路径

查询:START a=node(x)MATCH a-[rh:FOO*]->b RETURN rh; rh提供了所有可能的路径,但我不知道如何添加关于关系的标准

我在控制台()中创建了一个场景

创造 (a{name:“a”}), (b{名称:“b”}), (c{name:“c”}), (d{名称:“d”}), b-[:FOO{BAR:'1'}]->a, d-[:FOO{BAR:'1'}]->a, c-[:FOO{BAR:'2'}]->b, d-[:FOO{BAR:'1'}]->c 开始n=节点(4) 匹配n-[rh:FOO*]-b 返回rh; 这给了我 查询结果

+---------------------------------------------------------------------------+ | n.name | rh | b.name | +---------------------------------------------------------------------------+ | "D" | [:FOO[2] {BAR:"1"}] | "A" | | "D" | [:FOO[3] {BAR:"1"}] | "C" | | "D" | [:FOO[3] {BAR:"1"},:FOO[1] {BAR:"2"}] | "B" | | "D" | [:FOO[3] {BAR:"1"},:FOO[1] {BAR:"2"},:FOO[0] {BAR:"1"}] | "A" | +---------------------------------------------------------------------------+ +---------------------------------------------------------------------------+ |n.name | rh | b.name| +---------------------------------------------------------------------------+ |“D”|[:FOO[2]{BAR:“1”}]|“A”| |“D”|[:FOO[3]{BAR:“1”}]|“C”| |“D”[:FOO[3]{BAR:1},:FOO[1]{BAR:2}]|“B”| |“D”;[:FOO[3]{BAR:“1”},:FOO[1]{BAR:“2”},:FOO[0]{BAR:“1”}]|“A”| +---------------------------------------------------------------------------+ 但我只想

+---------------------------------------------------------------------------+ | n.name | rh | b.name | +---------------------------------------------------------------------------+ | "D" | [:FOO[2] {BAR:"1"}] | "A" | | "D" | [:FOO[3] {BAR:"1"}] | "C" | +---------------------------------------------------------------------------+ +---------------------------------------------------------------------------+ |n.name | rh | b.name| +---------------------------------------------------------------------------+ |“D”|[:FOO[2]{BAR:“1”}]|“A”| |“D”|[:FOO[3]{BAR:“1”}]|“C”| +---------------------------------------------------------------------------+
由于
rh
是一个集合,您可以应用:


由于
rh
是一个集合,您可以应用:


解决了,pff,我觉得很无聊。当你看到这个解决方案的时候,它是非常好的;-)我必须承认,谓词函数和使用/嵌套WHERE's是需要习惯的(我不习惯)。谢谢Stefan,你成就了我的一天。最大的区别在于
rh
是一个可变长度路径的集合,而不是一个普通匹配的单一关系。使用
过滤,其中rh.BAR=1
而不是上面的过滤器有什么区别?因为
rh
是一个集合(FOO*是可变长度!)您无法访问该服务器上的属性。因此需要使用收集功能。解决了,pff,我觉得这样一个noob。当你看到这个解决方案的时候,它是非常好的;-)我必须承认,谓词函数和使用/嵌套WHERE's是需要习惯的(我不习惯)。谢谢Stefan,你成就了我的一天。最大的区别在于
rh
是一个可变长度路径的集合,而不是一个普通匹配的单一关系。使用
过滤,其中rh.BAR=1
而不是上面的过滤器有什么区别?因为
rh
是一个集合(FOO*是可变长度!)您无法访问该服务器上的属性。因此,需要使用收集功能。 +---------------------------------------------------------------------------+ | n.name | rh | b.name | +---------------------------------------------------------------------------+ | "D" | [:FOO[2] {BAR:"1"}] | "A" | | "D" | [:FOO[3] {BAR:"1"}] | "C" | +---------------------------------------------------------------------------+
START n=node(4) 
MATCH n-[rh:FOO*]->b 
WHERE not any(r in rh where r.BAR="2") 
RETURN rh;