Create graph of node similarity result

You can try the following to visualize the users and their similarity.

Test Data

create 
(n1:User{name:"User_A"}), 
(n2:User{name:"User_B"}), 
(n3:User{name:"User_C"}),
(b1:Book{title:"A"}),
(b2:Book{title:"B"}),
(b3:Book{title:"C"}),
(b4:Book{title:"D"}),
(b5:Book{title:"E"}),
(b6:Book{title:"F"}),
(b7:Book{title:"G"}),
(b8:Book{title:"H"}),
(n1)-[:HAS_READ]->(b1),
(n1)-[:HAS_READ]->(b3),
(n1)-[:HAS_READ]->(b7),
(n2)-[:HAS_READ]->(b1),
(n2)-[:HAS_READ]->(b2),
(n2)-[:HAS_READ]->(b3),
(n2)-[:HAS_READ]->(b4),
(n2)-[:HAS_READ]->(b5),
(n2)-[:HAS_READ]->(b6),
(n3)-[:HAS_READ]->(b4),
(n3)-[:HAS_READ]->(b5),
(n3)-[:HAS_READ]->(b6),
(n3)-[:HAS_READ]->(b8)

Projection:

CALL gds.graph.project(
  'users',
  ['User','Book'],
  'HAS_READ'
)
YIELD
  graphName AS graph, nodeProjection, nodeCount AS nodes, relationshipProjection, relationshipCount AS rels

Query:

CALL gds.nodeSimilarity.stream('users')
YIELD node1, node2, similarity
WITH gds.util.asNode(node1) AS user1, gds.util.asNode(node2) AS user2, similarity
WHERE elementId(user1) < elementId(user2)
RETURN user1, user2, apoc.create.vRelationship(user1,'HAS_SIMILARITY',{similarity:similarity}, user2) as rel

Result:

1 Like