概述
AA指标(Adamic-Adar Index)是以其提出者Lada Adamic和Eytan Adar命名的节点相似度指标。该指标基于图中两个节点的共同邻居来衡量它们之间的潜在连接强度。
- L.A. Adamic, E. Adar, Friends and Neighbors on the Web (2003)
 
AA指标的基本思想是,度数较低的共同邻居能为两个节点间的相似度提供更有价值的信息,而度数较高的共同邻居则不然。它的计算公式如下:

其中,N(u)是与节点u相连的节点集合。对于两个节点的每个共同邻居u,AA指标首先计算其度数|N(u)|的对数的倒数,然后将所有共同邻居的这些倒数值相加。
AA 指标分值较高表示节点间的相似度较大,分值为0则表示两个节点间没有相似性。

在上图中,N(D) ∩ N(E) = {B, F},其中 = = 1.6610, = = 2.0959,因此AA(D,E) = 1.6610 + 2.0959 = 3.7569。
特殊说明
- AA指标算法忽略边的方向,按照无向边进行计算。
 
示例图

在一个空图中运行以下语句定义图结构并插入数据:
INSERT (A:default {_id: "A"}),
       (B:default {_id: "B"}),
       (C:default {_id: "C"}),
       (D:default {_id: "D"}),
       (E:default {_id: "E"}),
       (F:default {_id: "F"}),
       (G:default {_id: "G"}),
       (A)-[:default]->(B),
       (B)-[:default]->(E),
       (C)-[:default]->(B),
       (C)-[:default]->(D),
       (C)-[:default]->(F),
       (D)-[:default]->(B),
       (D)-[:default]->(E),
       (F)-[:default]->(D),
       (F)-[:default]->(G);
insert().into(@default).nodes([{_id:"A"}, {_id:"B"}, {_id:"C"}, {_id:"D"}, {_id:"E"}, {_id:"F"}, {_id:"G"}]);
insert().into(@default).edges([{_from:"A", _to:"B"}, {_from:"B", _to:"E"}, {_from:"C", _to:"B"}, {_from:"C", _to:"D"}, {_from:"C", _to:"F"}, {_from:"D", _to:"B"}, {_from:"D", _to:"E"}, {_from:"F", _to:"D"}, {_from:"F", _to:"G"}]);
创建HDC图
将当前图集全部加载到HDC服务器hdc-server-1上,并命名为 my_hdc_graph:
CREATE HDC GRAPH my_hdc_graph ON "hdc-server-1" OPTIONS {
  nodes: {"*": ["*"]},
  edges: {"*": ["*"]},
  direction: "undirected",
  load_id: true,
  update: "static"
}
hdc.graph.create("my_hdc_graph", {
  nodes: {"*": ["*"]},
  edges: {"*": ["*"]},
  direction: "undirected",
  load_id: true,
  update: "static"
}).to("hdc-server-1")
参数
算法名:topological_link_prediction
参数名  | 
类型  | 
规范  | 
默认值  | 
可选  | 
描述 | 
|---|---|---|---|---|---|
ids | 
[]_id | 
/ | / | 否 | 通过_id指定参与计算的第一组点;若未设置则计算所有点 | 
uuids | 
[]_uuid | 
/ | / | 否 | 通过_uuid指定参与计算的第一组点;若未设置则计算所有点 | 
ids2 | 
[]_id | 
/ | / | 否 | 通过_id指定参与计算的第二组点;若未设置则计算所有点 | 
uuids2 | 
[]_uuid | 
/ | / | 否 | 通过_uuid指定参与计算的第二组点;若未设置则计算所有点 | 
type | 
String | Adamic_Adar | 
Adamic_Adar | 
是 | 指定待计算的相似度类型;计算AA指标时,设置为Adamic_Adar | 
return_id_uuid | 
String | uuid, id, both | 
uuid | 
是 | 在结果中使用_uuid、_id或同时使用两者来表示点 | 
limit | 
Integer | ≥-1 | -1 | 
是 | 限制返回的结果数;-1返回所有结果 | 
文件回写
CALL algo.topological_link_prediction.write("my_hdc_graph", {
  ids: ["C"],
  ids2: ["A","E","G"],
  return_id_uuid: "id"
}, {
  file: {
    filename: "aa"
  }
})
algo(topological_link_prediction).params({
  projection: "my_hdc_graph",
  ids: ["C"],
  ids2: ["A","E","G"],
  return_id_uuid: "id"
}).write({
  file: {
    filename: "aa"
  }
})
结果:
_id1,_id2,result
C,A,1.66096
C,E,3.32193
C,G,2.0959
完整返回
CALL algo.topological_link_prediction.run("my_hdc_graph", {
  ids: ["C"],
  ids2: ["A","C","E","G"],
  type: "Adamic_Adar",
  return_id_uuid: "id"
}) YIELD aa
RETURN aa
exec{
  algo(topological_link_prediction).params({
    ids: ["C"],
    ids2: ["A","C","E","G"],
    type: "Adamic_Adar",
    return_id_uuid: "id"
  }) as aa
  return aa
} on my_hdc_graph
结果:
| _id1 | _id2 | result | 
|---|---|---|
| C | A | 1.660964 | 
| C | E | 3.321928 | 
| C | G | 2.095903 | 
流式返回
CALL algo.topological_link_prediction.stream("my_hdc_graph", {
  ids: ["C"],
  ids2: ["A", "B", "D", "E", "F", "G"],
  type: "Adamic_Adar",
  return_id_uuid: "id"
}) YIELD aa
FILTER aa.result >= 2
RETURN aa
exec{
  algo(topological_link_prediction).params({
    ids: ["C"],
    ids2: ["A", "B", "D", "E", "F", "G"],
    type: "Adamic_Adar",
    return_id_uuid: "id"
  }).stream() as aa
  where aa.result >= 2
  return aa
} on my_hdc_graph
结果:
| _id1 | _id2 | result | 
|---|---|---|
| C | D | 3.756867 | 
| C | E | 3.321928 | 
| C | G | 2.095903 |