Neo4j 密码:如何确保(A)-[:点到]->;(B) 但不是(B)-[:指向]->;(A) ??

Neo4j 密码:如何确保(A)-[:点到]->;(B) 但不是(B)-[:指向]->;(A) ??,neo4j,Neo4j,我在中设置了五个节点,每个节点[:指向]所有其他节点 我如何在下面的Cypher(2.2.0-M01)中包含一个{expression},以确保如果(a)-[:POINTS_到]->(b)在路径中没有(a)的实例的任何点,我猜您是在试图阻止neo4j尝试遍历循环路径。如果是这样的话,你不需要做任何事情来得到它。Cypher自动生成非循环路径,因为它不允许同一关系在结果中出现两次。(从技术上讲,它可以产生一种循环——其中开始节点与结束节点相同——但这是唯一可能的循环类型。)哦,天哪,我好像被记下来

我在中设置了五个节点,每个节点[:指向]所有其他节点


我如何在下面的Cypher(2.2.0-M01)中包含一个{expression},以确保如果(a)-[:POINTS_到]->(b)在路径中没有(a)的实例的任何点,我猜您是在试图阻止neo4j尝试遍历循环路径。如果是这样的话,你不需要做任何事情来得到它。Cypher自动生成非循环路径,因为它不允许同一关系在结果中出现两次。(从技术上讲,它可以产生一种循环——其中开始节点与结束节点相同——但这是唯一可能的循环类型。)

哦,天哪,我好像被记下来了。也许我应该强调一点,即每个节点对实际上有两个关系。每个方向一个。我也知道你的观点,但也许你错过了这个小贴士?(顺便说一句,我没有记下你的名字)为什么一定要有双向关系(因为它不能帮助neo4j在任何方向更快地遍历你的数据,而你最终得到的关系数是原来的两倍)?嗨,我的简单例子只是为了举例说明。实际数据库中的这些关系包含我在遍历/路径中积累的属性值。我将它们拆分为每个方向一个关系的原因是为了反转值ie 1/值。虽然你提出了一个有趣的观点,但只有当我有一个很好的方法来判断这条路径通过了关系的哪个方向时,我才能被说服将其简化为单一(双向)关系。您的想法是什么?您可以使用该函数确定关系的起始节点。还有一个
ENDNODE()
函数。对于两个节点之间的每个关系,都可以得到头部和尾部。您可以将这两个值作为关系的属性,并将其中一个用于尾到头,另一个用于头到尾。
MATCH p=(a:Temp)-[r:POINTS_TO*1..5]->(b:Temp)
WHERE a=b AND {expression}
RETURN extract(n IN nodes(p)|n.name) AS pseudopath