## 8.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:

### 8.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: 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.

### 8.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 8.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 8.8. Results
`score`

1.0

### 8.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 8.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`