图数据库中如何保留同类型边的最高/最低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
相关产品推荐
相关产品推荐

