如何使用Neo4J Cypher进行相对节点排序? [英] How to do relative node ordering using Neo4J Cypher?

查看:500
本文介绍了如何使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆