Neo4j新版GDS标签传播算法查询语法适配及报错解决
报错根因
旧版Neo4j 3.5配套的algo算法库和新版GDS库的调用逻辑存在本质差异:
- 旧版
algo.labelPropagation.stream支持直接传入节点筛选Cypher、关系筛选Cypher、算法配置三个参数 - 新版GDS的所有算法过程固定只接收2个入参:第一个参数为内存图配置/已创建的内存图名称,第二个为算法运行配置,直接传入3个参数就会触发你看到的参数数量不匹配报错
- 除此之外旧版的
algo.asNode方法、LPA返回的label字段在GDS中均有调整,直接替换过程名无法运行。
适配后可运行代码
推荐直接使用GDS支持的匿名Cypher投影写法,不需要提前创建/手动清理内存投影图,逻辑和你原来的旧语句完全对齐:
CALL gds.labelPropagation.stream( // 第一个参数:匿名图投影配置,替换原来的节点、关系Cypher入参 { nodeQuery: 'MATCH (p:Publication) RETURN id(p) as id', relationshipQuery: 'MATCH (p1:Publication)-[r1:HAS_WORD]->(w)<-[r2:HAS_WORD]-(p2:Publication) WHERE r1.occurrence > 5 AND r2.occurrence > 5 RETURN id(p1) as source, id(p2) as target, count(w) as weight', relationshipProperties: ['weight'] }, // 第二个参数:算法运行配置 { relationshipWeightProperty: 'weight' } ) YIELD nodeId, communityId AS label WITH label, collect(gds.util.asNode(nodeId)) as nodes where size(nodes) > 2 MERGE (c:PublicationLPACommunity {id : label}) FOREACH (n in nodes | MERGE (n)-[:IN_LPA_COMMUNITY]->(c) ) RETURN label, nodes
关键改动点说明
- 移除了原来直接传入算法过程的节点、关系Cypher语句,统一放到匿名图投影的
nodeQuery、relationshipQuery配置项中 - 旧版配置项
weightProperty替换为GDS标准的relationshipWeightProperty,用来指定计算时使用的关系权重字段 - LPA算法返回的社区ID字段从旧版的
label改名为communityId,这里通过AS label做别名保持后续逻辑不变 - 旧版的节点转换方法
algo.asNode替换为GDS配套的gds.util.asNode,功能完全一致,都是根据节点ID返回实体节点对象
如果需要多次复用这个投影图做其他算法计算,也可以提前创建命名投影图,运行完算法后调用gds.graph.drop('你的图名')释放内存即可。
内容的提问来源于stack exchange,提问作者Lakeside52
相关产品推荐
相关产品推荐

