3

图表要点: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))

任何见解将不胜感激。

4

1 回答 1

3

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;
于 2015-08-18T00:00:53.710 回答