Neo4j 在下一个节点不是上一个节点的位置创建路径?

Neo4j 在下一个节点不是上一个节点的位置创建路径?,neo4j,cypher,Neo4j,Cypher,我在一个图中有大约1.5m的节点,它们的结构如下(图) 我运行了一个Cypher查询,对遍历的每个关系执行计算: WITH 1 AS startVal MATCH x = (c:Currency)-[r:Arb*2]->(m) WITH x, REDUCE(s = startVal, e IN r | s * e.rate) AS endVal, startVal RETURN EXTRACT(n IN NODES(x) | n) as Exchanges, extract (

我在一个图中有大约1.5m的节点,它们的结构如下(图)

我运行了一个Cypher查询,对遍历的每个关系执行计算:

WITH 1 AS startVal
MATCH x = (c:Currency)-[r:Arb*2]->(m)
WITH x, REDUCE(s = startVal, e IN r | s * e.rate) AS endVal, startVal
RETURN EXTRACT(n IN NODES(x) | n) as Exchanges,
    extract ( e IN relationships(x) | startVal * e.rate) AS Rel,
    endVal, endVal - startVal AS Profit
ORDER BY Profit DESC LIMIT 5
问题是它返回路径
(“One”)->(“hop”)->(“One”)
,这对我来说是无用的

我如何才能使它不选择先前行走的节点作为下一个节点(即
“一个”->“跳跃”->“任何其他节点”,但不选择“一个”

我已经读到,
NODE\u RECENT
应该解决我的问题。但是,没有关于如何在RestAPI或APOC过程中指定最近节点长度的示例

我的案子有密码查询吗

多谢各位


另外,我对Neo4j和编码非常陌生(不到2个月)。因此,如果有一个明显的简单解决方案,我深表歉意。

请尝试在您的
匹配
条款后插入此条款,以筛选出
c
m
相同的情况:

WHERE c <> m
上述查询生成以下结果:

+-----------------------------------------------------------------------------------------+
| Exchanges                                                     | Rel   | endVal | Profit |
+-----------------------------------------------------------------------------------------+
| [Node[8]{name:"Two"},Node[7]{name:"hop"},Node[6]{name:"One"}] | [3,4] | 12     | 11     |
| [Node[6]{name:"One"},Node[7]{name:"hop"},Node[8]{name:"Two"}] | [1,2] | 2      | 1      |
+-----------------------------------------------------------------------------------------+

我不知道我是否完全理解了您的问题,但我相信您的问题可以通过在
匹配
上添加
WHERE
子句来解决,以防止不想要的关系匹配,如下所示:

WITH 1 AS startVal
MATCH x = (c:Currency)-[r:Arb*2]->(m)
WHERE NOT (m)-[:Arb]->(c)
WITH x, REDUCE(s = startVal, e IN r | s * e.rate) AS endVal, startVal
RETURN EXTRACT(n IN NODES(x) | n) as Exchanges,
    extract ( e IN relationships(x) | startVal * e.rate) AS Rel,
    endVal, endVal - startVal AS Profit
ORDER BY Profit DESC LIMIT 5

它仍然返回[{“name”:“Two”},{“name”:“hop”},{“name”:“Two”}]:(我试图做的是:让节点“One”作为开始节点。下一步是“hop”。当我在“hop”时,我可以转到“One”节点或“Two”。因为我来自“One”节点,所以我不想再回到它。当我在“hop”时,有没有办法得到上一个节点“节点并将其修剪成下一个节点?类似于(n-1)(n+1)?@Dashtea您尝试过cybersam解决方案吗?也就是说:在
匹配后放置
其中Cm
。这样:
将1作为startVal匹配x=(c:Currency)-(r:Arb*2>)-(m)其中Cm与x,REDUCE(s=startVal,e在r | s*e.rate中)作为endVal,startVal返回EXTRACT(n在节点(x)| n)作为交换,EXTRACT(e在关系(x)| startVal*e.rate)作为Rel,endVal,endVal-startVal作为利润顺序按利润下降限制5
他的解决方案使我的路径在“跳跃”上结束节点。这对我来说是不正确的。有没有办法让路径只考虑有2个关系的节点?@ dulkToA <代码>:货币< /代码>标签只在一个节点上:货币标签是“一个”和“两个”节点。“跳”节点有标签:Actudio现在查询返回[{“名称”:“2”},{“名称”:“HOP”}和其他在“HOP”上结束的路径。节点。我不能有以“跃点”结尾的路径node.对我来说工作正常。我已经编辑了我的答案,用测试数据显示了结果。我认为这里的问题是输出中不需要第一行。也许你应该在模式的第一个节点中使用一个唯一标识符
MATCH
ed,类似于:
MATCH x=(c:Currency{id:1})-[r:Arb*2]>(m)
@dashtea你能澄清我的结果是否是你想要的吗?还有,哪些节点有
货币
标签?@cybersam你发布的结果正是我想要的。在我的例子中,“一”和“两”节点被标记为:货币,“跃点”节点被标记为:账户。在两个给定的货币节点之间至少有一个账户“hop”节点。但是“hop”节点只有两个连接的帐户节点。我需要创建一个模式,其中连接到“hop”节点的节点是唯一的。
+-----------------------------------------------------------------------------------------+
| Exchanges                                                     | Rel   | endVal | Profit |
+-----------------------------------------------------------------------------------------+
| [Node[8]{name:"Two"},Node[7]{name:"hop"},Node[6]{name:"One"}] | [3,4] | 12     | 11     |
| [Node[6]{name:"One"},Node[7]{name:"hop"},Node[8]{name:"Two"}] | [1,2] | 2      | 1      |
+-----------------------------------------------------------------------------------------+
WITH 1 AS startVal
MATCH x = (c:Currency)-[r:Arb*2]->(m)
WHERE NOT (m)-[:Arb]->(c)
WITH x, REDUCE(s = startVal, e IN r | s * e.rate) AS endVal, startVal
RETURN EXTRACT(n IN NODES(x) | n) as Exchanges,
    extract ( e IN relationships(x) | startVal * e.rate) AS Rel,
    endVal, endVal - startVal AS Profit
ORDER BY Profit DESC LIMIT 5