9.3. The Preferential Attachment algorithm

This section describes the Preferential Attachment algorithm in the Neo4j Graph Algorithms library.

Preferential Attachment is a measure used to compute the closeness of nodes, based on their shared neighbors.

This section includes:

9.3.1. History and explanation

Preferential attachment means that the more connected a node is, the more likely it is to receive new links. This algorithm was popularised by Albert-László Barabási and Réka Albert through their work on scale-free networks. It is computed using the following formula:

preferential attachment

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.

9.3.2. Preferential Attachment algorithm sample

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

Table 9.7. Results
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

Table 9.8. Results
score

1.0

9.3.3. Syntax

The following will run the algorithm and return the result: 

RETURN algo.linkprediction.preferentialAttachment(node1:Node, node2:Node, {
    relationshipQuery: null,
    direction: "BOTH"
})

Table 9.9. Parameters
Name Type Default Optional Description

node1

Node

null

no

A node

node2

Node

null

no

Another node

relationshipQuery

String

null

yes

The relationship type used to compute similarity between node1 and node2

direction

String

BOTH

yes

The direction of relationship type used to compute similarity between node1 and node2