gpt4 book ai didi

neo4j - Cypher COLLECT 使 UNWIND 以错误的顺序展开

转载 作者:行者123 更新时间:2023-12-01 13:50:34 30 4
gpt4 key购买 nike

图表要点:http://gist.neo4j.org/?6182d024325343760cb4

我想按顺序获得(最长的)路径,并且在我添加 COLLECT 语句之前它按预期工作,是否有关于 Cypher 和 COLLECT 的内容我只是不明白,或者这是一个错误?

此查询按预期工作,以正确的顺序返回路径中的节点:

MATCH (n:Cable { name: 'Cable3' })-[:Connected_to*]-(port:Port)
OPTIONAL MATCH path=(port)-[:Connected_to*]-()
WITH nodes(path) AS parts, length(path) AS len
ORDER BY len DESC
LIMIT 1 UNWIND parts AS part
RETURN part

这个没有 COLLECT 语句,以正确的顺序返回节点,但也返回部件和父级之间的节点(如预期的那样)。
MATCH (n:Cable { name: 'Cable3' })-[:Connected_to*]-(port:Port)
OPTIONAL MATCH path=(port)-[:Connected_to*]-()
WITH nodes(path) AS parts, length(path) AS len
ORDER BY len DESC
LIMIT 1 UNWIND parts AS part
OPTIONAL MATCH (part)<-[:Has*1..10]-(parent)
RETURN part, parent

此查询未按预期工作,以另一种顺序返回路径中的节点:
MATCH (n:Cable { name: 'Cable3' })-[:Connected_to*]-(port:Port)
OPTIONAL MATCH path=(port)-[:Connected_to*]-()
WITH nodes(path) AS parts, length(path) AS len
ORDER BY len DESC
LIMIT 1 UNWIND parts AS part
OPTIONAL MATCH (part)<-[:Has*1..10]-(parent)
RETURN part, LAST(COLLECT(parent))

任何见解将不胜感激。

最佳答案

UNWIND实际上仍然以预期的顺序返回行。相反,它是聚合函数,COLLECT() ,即“重新排列”结果行。 neo4j 不保证聚合函数的结果行将按任何特定顺序排列(没有 ORDER BY 子句)。

这是避免使用聚合的解决方法。它可能适用于您的特定用例,具体取决于您的要求。此查询过滤第二个 OPTIONAL MATCH以便它包含 Has 的最长可能序列关系(只要最长序列 <= 10 跳——您应该根据需要调整它,或考虑消除最大值)。该查询仅返回每个结果行中最远的“祖先”,这些行将保持您期望的顺序。

MATCH (n:Cable { name: 'Cable3' })-[:Connected_to*]-(port:Port)
OPTIONAL MATCH path=(port)-[:Connected_to*]-()
WITH nodes(path) AS parts, length(path) AS len
ORDER BY len DESC
LIMIT 1 UNWIND parts AS part
OPTIONAL MATCH (part)<-[:Has*1..10]-(ancestor)
WHERE NOT (ancestor)<-[:Has]-()
RETURN part, ancestor;

关于neo4j - Cypher COLLECT 使 UNWIND 以错误的顺序展开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32053973/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com