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

如何基于相同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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:01:01