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

时间:2018-02-06 04:52:24

标签: neo4j cypher spring-data-neo4j

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

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

然而,在我上面的例子中,除了依赖于A之外,C还依赖于B.我希望对结果集进行排序,使B在C之前出现。我可以在代码中执行此操作,但是有一个使用Cypher的方法吗?

1 个答案:

答案 0 :(得分:1)

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

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