You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

图数据库中如何保留同类型边的最高/最低rank边并识别其值与数量?

图数据库中保留特定边及统计rank信息方案

一、仅保留两节点间同类型边的最高/最低rank边

以下针对主流图数据库给出具体实现:

1. Neo4j(Cypher语句)

查询保留的边

MATCH (a)-[r:REL_TYPE]->(b)
WITH a, b, type(r) AS relType, max(r.rank) AS maxRank, min(r.rank) AS minRank
MATCH (a)-[r:REL_TYPE]->(b)
WHERE r.rank = maxRank OR r.rank = minRank
RETURN a, r, b

删除多余边

MATCH (a)-[r:REL_TYPE]->(b)
WITH a, b, type(r) AS relType, max(r.rank) AS maxRank, min(r.rank) AS minRank
MATCH (a)-[r:REL_TYPE]->(b)
WHERE r.rank <> maxRank AND r.rank <> minRank
DELETE r

2. JanusGraph(Gremlin语句)

查询保留的边

g.V().as('a').outE('REL_TYPE').as('r').inV().as('b')
.group()
.by(select('a','b','r').by(label))
.by(select('r').values('rank').fold())
.unfold()
.map{ [key:it.key, minRank:it.value.min(), maxRank:it.value.max()] }
.as('rankInfo')
.V().as('a').outE('REL_TYPE').as('r').inV().as('b')
.where(select('r').values('rank').is(eq(select('rankInfo').select('minRank'))).or(eq(select('rankInfo').select('maxRank'))))
.select('a','r','b')

删除多余边

g.V().as('a').outE('REL_TYPE').as('r').inV().as('b')
.group()
.by(select('a','b','r').by(label))
.by(select('r').values('rank').fold())
.unfold()
.map{ [key:it.key, minRank:it.value.min(), maxRank:it.value.max()] }
.as('rankInfo')
.V().as('a').outE('REL_TYPE').as('r').inV().as('b')
.where(select('r').values('rank').is(neq(select('rankInfo').select('minRank'))).and(neq(select('rankInfo').select('maxRank'))))
.drop()

二、识别最高/最低rank值及对应数量

1. 全局范围统计(整个图中该类型边的情况)

Neo4j(Cypher)

MATCH ()-[r:REL_TYPE]->()
WITH max(r.rank) AS globalMaxRank, min(r.rank) AS globalMinRank
MATCH ()-[r:REL_TYPE]->()
WITH globalMaxRank, globalMinRank,
     count(CASE WHEN r.rank = globalMaxRank THEN 1 END) AS maxRankCount,
     count(CASE WHEN r.rank = globalMinRank THEN 1 END) AS minRankCount
RETURN globalMaxRank, maxRankCount, globalMinRank, minRankCount

JanusGraph(Gremlin)

g.E().hasLabel('REL_TYPE').values('rank')
.fold()
.map{ 
    def ranks = it.get();
    [
        globalMaxRank: ranks.max(),
        maxRankCount: ranks.count{it == ranks.max()},
        globalMinRank: ranks.min(),
        minRankCount: ranks.count{it == ranks.min()}
    ]
}

2. 按节点对分组统计(每对节点间的该类型边情况)

Neo4j(Cypher)

MATCH (a)-[r:REL_TYPE]->(b)
WITH a, b, type(r) AS relType, 
     max(r.rank) AS maxRank, min(r.rank) AS minRank,
     count(CASE WHEN r.rank = max(r.rank) THEN 1 END) AS maxRankCount,
     count(CASE WHEN r.rank = min(r.rank) THEN 1 END) AS minRankCount
RETURN a, b, relType, maxRank, maxRankCount, minRank, minRankCount

JanusGraph(Gremlin)

g.V().as('a').outE('REL_TYPE').as('r').inV().as('b')
.group()
.by(select('a','b').by(id))
.by(select('r').values('rank').fold())
.unfold()
.map{
    def ranks = it.value;
    [
        nodePair: it.key,
        maxRank: ranks.max(),
        maxRankCount: ranks.count{it == ranks.max()},
        minRank: ranks.min(),
        minRankCount: ranks.count{it == ranks.min()}
    ]
}

内容的提问来源于stack exchange,提问作者Lisa Liu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 04:15:37