neo4j是否默认过滤match子句中的循环关系

neo4j是否默认过滤match子句中的循环关系,neo4j,cypher,Neo4j,Cypher,如果节点a和B之间的关系是a-[:knows]->B,那么下面的查询不会返回任何结果 MATCH (A)-[:knows]-(B)-[:knows]-(A) return *; 而带有显式“with”的查询是有效的 MATCH (A)-[:knows]-(B) with B MATCH (B)-[:knows]-(A) return *; 为什么会有这种行为?为什么第一个查询不返回任何内容? 即使我在匹配查询中使用关系方向,行为也不会改变。在模式中,Cypher只遍历一次关系 对于您的模式(

如果节点a和B之间的关系是a-[:knows]->B,那么下面的查询不会返回任何结果

MATCH (A)-[:knows]-(B)-[:knows]-(A) return *;
而带有显式“with”的查询是有效的

MATCH (A)-[:knows]-(B) with B MATCH (B)-[:knows]-(A) return *;
为什么会有这种行为?为什么第一个查询不返回任何内容?
即使我在匹配查询中使用关系方向,行为也不会改变。

在模式中,Cypher只遍历一次关系

对于您的模式
(A)-[r1:knows]-(B)-[r2:knows]-(A)
r1
必须与
r2
不同。 因此,如果
A
B
之间只有一个关系,则此模式将不返回任何结果


这种行为是为了避免查询周期。

此外,
匹配(A)-[:knows]-(B)-[:knows]-(A)
(使用非方向关系)甚至没有多大意义(除了有时返回意外结果)<代码>匹配(A)-[:knows]-(B)或“匹配(B)-[:knows]-(A)`更合理。你是对的,第一次匹配(A)-[:knows]-(B)-[:knows]-(A)没有意义。但是,我有一个函数,它接受3个参数,并生成一个类似MATCH(arg1)-[:knows](arg2)-[:knows](arg3)的查询,并且可能可以用arg1=a、arg2=B、arg3=a调用。我试图避免使用显式的“with”子句将上述匹配拆分为两个单独的匹配语句。我想我会重新检查我的调用者是否能够检测到arg1=arg3的情况并做一些不同的事情。