Neo4J Cypher 中的节点排名
Node ranking in Neo4J Cypher
这是对我的问题 的跟进。我在那里接受了答案,但后来意识到我的用例涉及更多。以下是我正在使用的图表的一部分,所需的节点顺序显示在 table 中。显然,我应该按入度排序,但是对于具有相同入度的节点,需要考虑它们之间的关系(图中的节点S
和A
).不允许循环。
我怎样才能做到这一点?
以下似乎可以完成这项工作(感谢 this)。我是 Cypher 和 Neo4J 的新手,因此,欢迎其他答案,如果在某些情况下它可能不起作用,也欢迎对以下内容发表评论。
MATCH p = allShortestPaths((a:App)-[:DEPENDS_ON*0..10]->(b:App))
WHERE a <> b
WITH b.name as bn, count(p) AS c
WITH COLLECT({name:bn, count:c}) AS paths
MATCH (a:App) WHERE NOT ()-[:DEPENDS_ON]->(a)
WITH paths + COLLECT({name:a.name, count:0}) AS allPaths
UNWIND allPaths AS path
WITH path.name AS name, path.count AS count
RETURN name, count
ORDER BY count DESC
对于上述图形,上面的查询产生以下结果:
╒═════════╤═══════╕
│"name" │"count"│
╞═════════╪═══════╡
│"C" │4 │
├─────────┼───────┤
│"S" │3 │
├─────────┼───────┤
│"A" │1 │
├─────────┼───────┤
│"GW" │0 │
├─────────┼───────┤
│"GC" │0 │
└─────────┴───────┘
这是对我的问题 S
和A
).不允许循环。
我怎样才能做到这一点?
以下似乎可以完成这项工作(感谢 this)。我是 Cypher 和 Neo4J 的新手,因此,欢迎其他答案,如果在某些情况下它可能不起作用,也欢迎对以下内容发表评论。
MATCH p = allShortestPaths((a:App)-[:DEPENDS_ON*0..10]->(b:App))
WHERE a <> b
WITH b.name as bn, count(p) AS c
WITH COLLECT({name:bn, count:c}) AS paths
MATCH (a:App) WHERE NOT ()-[:DEPENDS_ON]->(a)
WITH paths + COLLECT({name:a.name, count:0}) AS allPaths
UNWIND allPaths AS path
WITH path.name AS name, path.count AS count
RETURN name, count
ORDER BY count DESC
对于上述图形,上面的查询产生以下结果:
╒═════════╤═══════╕
│"name" │"count"│
╞═════════╪═══════╡
│"C" │4 │
├─────────┼───────┤
│"S" │3 │
├─────────┼───────┤
│"A" │1 │
├─────────┼───────┤
│"GW" │0 │
├─────────┼───────┤
│"GC" │0 │
└─────────┴───────┘