如何使用 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
我正在使用 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