## 9.2. The Common Neighbors algorithm

This section describes the Common Neighbors algorithm in the Neo4j Graph Algorithms library.

Common neighbors captures the idea that two strangers who have a friend in common are more likely to be introduced than those who don’t have any friends in common.

This section includes:

### 9.2.1. History and explanation

It is computed using the following formula:

where `N(x)` is the set of nodes adjacent to node `x`, and `N(y)` is the set of nodes adjacent to node `y`.

A value of 0 indicates that two nodes are not close, while higher values indicate nodes are closer.

The library contains a function to calculate closeness between two nodes.

### 9.2.2. Common Neighbors 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 number of common neighbors for Michael and Karin:

``````MATCH (p1:Person {name: 'Michael'})
MATCH (p2:Person {name: 'Karin'})

Table 9.4. Results
`score`

1.0

We can also compute the score of a pair of nodes based on a specific relationship type.

The following will return the number of common neighbors for Michael and Karin based only on the `FRIENDS` relationships:

``````MATCH (p1:Person {name: 'Michael'})
MATCH (p2:Person {name: 'Karin'})
RETURN algo.linkprediction.commonNeighbors(p1, p2, {relationshipQuery: "FRIENDS"}) AS score``````

Table 9.5. Results
`score`

0.0

### 9.2.3. Syntax

The following will run the algorithm and return the result:

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

Table 9.6. 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`