Neo4j多关系二分图转单分图及关联边权重计算方法咨询
Neo4j二分图转多关系单分图实现方案
方案1:直接用Cypher生成物理RELATED_TO边
无需依赖GDS库,直接把共现关系写入图库:
- 先清理已有的RELATED_TO边(避免重复写入)
MATCH ()-[r:RELATED_TO]->() DELETE r;
- 匹配所有符合要求的实体共现路径,统计权重后写入边
MATCH path = (e1:Entity)-[*]->(e2:Entity) // 过滤规则:路径中间节点全部为Post类型,无其他实体 WHERE ALL(node IN nodes(path)[1..-1] WHERE node:Post) // 避免重复统计:排除自环,且仅统计e1 id小于e2 id的对,避免双向重复 AND id(e1) < id(e2) // 可选:限制路径最大长度,比如最多经过2个Post节点可加 AND length(path) <=3 WITH e1, e2, count(path) AS cooccur_weight MERGE (e1)-[r:RELATED_TO]-(e2) SET r.weight = cooccur_weight;
这个方案会自动适配你提到的所有路径场景,不管中间是1个还是多个Post、不管路径中的关系类型是什么,只要满足中间节点都是Post的要求,都会被统计为一次共现计入权重。
方案2:用GDS库生成虚拟单分图(适合做图分析不需要物理存边的场景)
如果只是临时用单分图跑算法,不需要把关系持久化到图库,可以用GDS的二分图投影功能直接生成虚拟图:
- 先把原始二分图投影到GDS的图目录
CALL gds.graph.project( 'entity_bipartite_graph', ['Entity', 'Post'], // 这里列全所有你需要纳入统计的关系类型 ['TWEETED', 'AT_MENTIONED', 'QUOTE_TWEETED', 'PUBLISHED', 'MENTIONS'] ) YIELD graphName, nodeCount, relationshipCount;
- 生成单分图投影,直接获取实体对和共现权重
CALL gds.alpha.bipartite.projection.stream('entity_bipartite_graph', { nodeProjection: 'Entity', relationshipProjection: { RELATED_TO: { type: '*', orientation: 'UNDIRECTED', aggregation: 'COUNT' } } }) YIELD sourceNodeId, targetNodeId, count // 拿到结果后可以直接用于后续分析,也可以选择写入物理边 WITH gds.util.asNode(sourceNodeId) AS e1, gds.util.asNode(targetNodeId) AS e2, count AS weight MERGE (e1)-[r:RELATED_TO]-(e2) SET r.weight = weight;
可选调整规则
- 如果需要区分不同路径的权重,比如经过1个Post的共现权重为1,经过2个Post的权重为0.5,只需要把
count(path)替换为sum(CASE WHEN length(path) = 2 THEN 1 WHEN length(path) =3 THEN 0.5 ELSE 0 END)即可 - 如果不需要跨Post的共现(也就是你举的第二个QUOTE_TWEETED的场景不需要统计),直接加
length(path) = 2的过滤条件即可
内容的提问来源于stack exchange,提问作者CowCookie
相关产品推荐
相关产品推荐

