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: