This section describes the Preferential Attachment algorithm in the Neo4j Labs Graph Algorithms library.
Preferential Attachment is a measure used to compute the closeness of nodes, based on their shared neighbors.
The Preferential Attachment algorithm was developed by the Neo4j Labs team and is not officially supported. 
This section includes:
Preferential attachment means that the more connected a node is, the more likely it is to receive new links. This algorithm was popularised by AlbertLászló Barabási and Réka Albert through their work on scalefree networks. It is computed using the following formula:
where N(u)
is the set of nodes adjacent to u
.
A value of 0 indicates that two nodes are not close, while higher values indicate that nodes are closer.
The library contains a function to calculate closeness between two nodes.
The following will create a sample graph:
MERGE (zhen:Person {name: "Zhen"})
MERGE (praveena:Person {name: "Praveena"})
MERGE (michael:Person {name: "Michael"})
MERGE (arya:Person {name: "Arya"})
MERGE (karin:Person {name: "Karin"})
MERGE (zhen)[:FRIENDS](arya)
MERGE (zhen)[:FRIENDS](praveena)
MERGE (praveena)[:WORKS_WITH](karin)
MERGE (praveena)[:FRIENDS](michael)
MERGE (michael)[:WORKS_WITH](karin)
MERGE (arya)[:FRIENDS](karin)
The following will return the Preferential Attachment score for Michael and Karin:
MATCH (p1:Person {name: 'Michael'})
MATCH (p2:Person {name: 'Karin'})
RETURN algo.linkprediction.preferentialAttachment(p1, p2) AS score
score 

6.0 
We can also compute the score of a pair of nodes based on a specific relationship type.
The following will return the Preferential Attachment score for Michael and Karin based only on the FRIENDS
relationship:
MATCH (p1:Person {name: 'Michael'})
MATCH (p2:Person {name: 'Karin'})
RETURN algo.linkprediction.preferentialAttachment(p1, p2, {relationshipQuery: "FRIENDS"}) AS score
score 

1.0 
The following will run the algorithm and return the result:
RETURN algo.linkprediction.preferentialAttachment(node1:Node, node2:Node, {
relationshipQuery: null,
direction: "BOTH"
})
Name  Type  Default  Optional  Description 


Node 
null 
no 
A node 

Node 
null 
no 
Another node 

String 
null 
yes 
The relationship type used to compute similarity between 

String 
BOTH 
yes 
The direction of relationship type used to compute similarity between 