如何使用Neo4J Cypher进行相对节点排序? [英] How to do relative node ordering using Neo4J Cypher?
问题描述
我正在使用Neo4J构建Maven依赖图.我需要支持的查询之一是找到所有依赖特定依赖项的节点.因此,如果C依赖于B和A,而B依赖于A,则findByDependency(A)
应该返回B和C.我使用以下查询实现了这一点,并且可以正常工作:
I'm building a Maven dependency graph using Neo4J. One of the queries I need to support is finding all nodes that depend on a particular dependency. So if C depends on B and A, and B depends on A, findByDependency(A)
should return B and C. I implemented this using the following query, and it's working:
MATCH (v1)-[:DEPENDS_ON]->(v2)
WHERE EXISTS (v1.gav) AND v2.gav = "A"
RETURN DISTINCT v1.gav
但是,在上面的示例中,C除了依赖于A之外,C还依赖于B.我希望对结果集进行排序,以使B排在C之前.我可以在代码中进行此操作,但是这里有一个使用Cypher的方法吗?
However, in my example above, C also depends on B in addition to depending on A. I'd like the result set to be sorted such that B comes before C. I can do this in code, but is there a way to do it using Cypher?
推荐答案
如果我正确理解,则需要计算节点的相互依赖性:
If I understood correctly, then you need to calculate the interdependence of the nodes:
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
这篇关于如何使用Neo4J Cypher进行相对节点排序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!