如何基于相同Attribute数量排序,查找指定Entity节点的相似节点?
实现Entity节点相似性查询的两种方案
方案一:纯Cypher直接查询
直接写Cypher就能搞定,不用依赖GDS库,步骤清晰还高效:
// 先拿到id_obj为'111'的Entity关联的所有Attribute MATCH (:Entity {id_obj: '111'})-[:HasAttribute]->(targetAttr:Attribute) // 找出所有关联这些Attribute的其他Entity节点 MATCH (similarEntity:Entity)-[:HasAttribute]->(targetAttr) WHERE similarEntity.id_obj <> '111' // 排除目标节点自身 // 统计每个相似节点的共同Attribute数量,按数量降序排序 WITH similarEntity, COUNT(DISTINCT targetAttr) AS commonAttrCount ORDER BY commonAttrCount DESC, similarEntity.id_obj RETURN similarEntity.id_obj AS entityId, commonAttrCount
这个查询逻辑很直白:先抓目标节点的所有属性,再反向找共享这些属性的其他Entity,最后统计共享数量排序。
方案二:用GDS Filtered Node Similarity算法
如果一定要用图数据科学库的话,得先构建子图,再针对单个节点计算相似性:
1. 投影子图
先把Entity和Attribute节点以及它们的关系投影成一个临时图:
CALL gds.graph.project( 'entity-attr-subgraph', ['Entity', 'Attribute'], {HasAttribute: {orientation: 'UNDIRECTED'}} )
把关系设为无向,方便算法识别Attribute作为两个Entity的共同邻居。
2. 针对目标节点计算相似性
用nodeSimilarity.filtered,指定只计算目标节点和其他Entity的相似性,选OVERLAP指标的话,返回的相似度就是共同Attribute的数量:
CALL gds.nodeSimilarity.filtered.stream('entity-attr-subgraph', { sourceNodeFilter: 'n:Entity AND n.id_obj = "111"', targetNodeFilter: 'n:Entity AND n.id_obj <> "111"', similarityMetric: 'OVERLAP', // 直接返回共同Attribute的数量 topK: 10 // 可选,只返回前10个最相似的节点 }) YIELD node1, node2, similarity // 把节点ID映射回id_obj属性 MATCH (e:Entity) WHERE e.id = node2 RETURN e.id_obj AS entityId, similarity AS commonAttrCount ORDER BY commonAttrCount DESC
3. 清理临时图(可选)
用完子图后可以删掉,避免占用资源:
CALL gds.graph.drop('entity-attr-subgraph')
内容的提问来源于stack exchange,提问作者user3154653
相关产品推荐
相关产品推荐

