如何使用 Neo4J Cypher 进行相对节点排序?

How to do relative node ordering using Neo4J Cypher?

我正在使用 Neo4J 构建 Maven 依赖关系图。我需要支持的查询之一是查找依赖于特定依赖项的所有节点。因此,如果 C 依赖于 B 和 A,而 B 依赖于 A,findByDependency(A) 应该 return B 和 C。我使用以下查询实现了它,并且它正在运行:

MATCH (v1)-[:DEPENDS_ON]->(v2)
WHERE EXISTS (v1.gav) AND v2.gav = "A"
RETURN DISTINCT v1.gav

但是,在我上面的示例中,C 除了依赖 A 之外还依赖 B。我希望对结果集进行排序,使 B 在 C 之前。我可以在代码中执行此操作,但是有没有办法使用 Cypher 来做到这一点?

如果我没理解错,那么你需要计算节点的相互依赖性:

MATCH (v1)-[:DEPENDS_ON]->(v2 {gav: 'A'}) WHERE EXISTS(v1.gav)
OPTIONAL MATCH (v1)<-[:DEPENDS_ON]-(v3)-[:DEPENDS_ON]->(v2) WHERE EXISTS(v3.gav)
WITH DISTINCT v1.gav AS gav, 
     COUNT(v3) AS sortValue
RETURN gav 
ORDER BY sortValue DESC

更新:另一种方式:

MATCH p = (v1)-[:DEPENDS_ON*1..2]->(v2 {gav: 'A'}) 
    WHERE ALL(n IN NODES(p)[0..-1] WHERE EXISTS(n.gav))
WITH DISTINCT v1.gav AS gav, 
     SUM(LENGTH(p)) AS sortValue
RETURN gav 
ORDER BY sortValue ASC