Overview
The Adamic-Adar Index (AA Index) is a node similarity metric named after its creators Lada Adamic and Eytan Adar. This index measures the potential connection strength between two nodes based on the shared neighbors they have in the graph.
- L.A. Adamic, E. Adar, Friends and Neighbors on the Web (2003)
The underlying idea of the AA Index is that common neighbors with low degree provide more valuable information about the similarity between two nodes than common neighbors with high degrees. It is computed using the following formula:
where N(u) is the set of nodes adjacent to u. For each common neighbor u of the two nodes, the AA Index first calculates the reciprocal of the logarithm of its degree |N(u)|, then sums up these reciprocal values for all common neighbors.
Higher AA Index scores indicate greater similarity between nodes, while a score of 0 indicates no similarity between two nodes.
In this example, N(D) ∩ N(E) = {B, F}, where = = 1.6610, = = 2.0959, thus AA(D,E) = 1.6610 + 2.0959 = 3.7569.
Considerations
- The AA Index algorithm ignores the direction of edges but calculates them as undirected edges.
Example Graph
To create this graph:
// Runs each row separately in order in an empty graphset
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"}])
Creating HDC Graph
To load the entire graph to the HDC server hdc-server-1
as hdc_tlp
:
CALL hdc.graph.create("hdc-server-1", "hdc_tlp", {
nodes: {"*": ["*"]},
edges: {"*": ["*"]},
direction: "undirected",
load_id: true,
update: "static",
query: "query",
default: false
})
hdc.graph.create("hdc_tlp", {
nodes: {"*": ["*"]},
edges: {"*": ["*"]},
direction: "undirected",
load_id: true,
update: "static",
query: "query",
default: false
}).to("hdc-server-1")
Parameters
Algorithm name: topological_link_prediction
Name |
Type |
Spec |
Default |
Optional |
Description |
---|---|---|---|---|---|
ids |
[]_id |
/ | / | No | Specifies the first group of nodes for computation by their _id ; computes for all nodes if it is unset. |
uuids |
[]_uuid |
/ | / | No | Specifies the first group of nodes for computation by their _uuid ; computes for all nodes if it is unset. |
ids2 |
[]_id |
/ | / | No | Specifies the second group of nodes for computation by their _id ; computes for all nodes if it is unset. |
uuids2 |
[]_uuid |
/ | / | No | Specifies the second group of nodes for computation by their _uuid ; computes for all nodes if it is unset. |
type |
String | Adamic_Adar |
Adamic_Adar |
Yes | Specifies the similarity type; for AA Index, keep it as Adamic_Adar . |
return_id_uuid |
String | uuid , id , both |
uuid |
Yes | Includes _uuid , _id , or both to represent nodes in the results. |
limit |
Integer | ≥-1 | -1 |
Yes | Limits the number of results returned; -1 includes all results. |
File Writeback
CALL algo.topological_link_prediction.write("hdc_tlp", {
params: {
ids: ["C"],
ids2: ["A","E","G"],
return_id_uuid: "id"
},
return_params: {
file: {
filename: "aa.txt"
}
}
})
algo(topological_link_prediction).params({
project: "hdc_tlp",
ids: ["C"],
ids2: ["A","E","G"],
return_id_uuid: "id"
}).write({
file: {
filename: "aa.txt"
}
})
Result:
_id1,_id2,result
C,A,1.66096
C,E,3.32193
C,G,2.0959
Full Return
CALL algo.topological_link_prediction("hdc_tlp", {
params: {
ids: ["C"],
ids2: ["A","C","E","G"],
type: "Adamic_Adar",
return_id_uuid: "id"
},
return_params: {}
}) 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 hdc_tlp
Result:
_id1 | _id2 | result |
---|---|---|
C | A | 1.660964 |
C | E | 3.321928 |
C | G | 2.095903 |
Stream Return
MATCH (n)
RETURN collect_list(n._id) AS IdList
NEXT
CALL algo.topological_link_prediction("hdc_tlp", {
params: {
ids: ["C"],
ids2: IdList,
type: "Adamic_Adar",
return_id_uuid: "id"
},
return_params: {
stream: {}
}
}) YIELD aa
FILTER aa.result >= 2
RETURN aa
find().nodes() as n
with collect(n._id) as IdList
exec{
algo(topological_link_prediction).params({
ids: ["C"],
ids2: IdList,
type: "Adamic_Adar",
return_id_uuid: "id"
}).stream() as aa
where aa.result >= 2
return aa
} on hdc_tlp
Result:
_id1 | _id2 | result |
---|---|---|
C | D | 3.756867 |
C | E | 3.321928 |
C | G | 2.095903 |