Hi!
I have a use case where I want to use nodeSimilarity on a graph with 2 node types, to get a SIMILAR relationship.
I then want to use the Leiden algorithm to get communities of similar nodes.
My initial thought was to project the graph, then use nodeSimilarity.mutate to get the SIMILAR relationships with weights and use the same projection for Leiden.
However, the Leiden algorithm only accepts UNDIRECTED relationships and mutate produces pairs of directed relationships.
The only way I can think of to get around this is to write the SIMILAR relationships back to the graph and do a new graph projection, then run Leiden.
This however results in a lot of writing that seems unneccessary!
Is there any way around this? Can one project from the projection? Force the relationships to be undirected?
It is a big graph so i'd rather not write when i dont have to!
When you project with projection of undirected, it does so by projecting pairs of bidirectional relationships. As such, the mutate may be giving what you need. Have you tried it?
G, res = gds.graph.project('gds_test', '*', '*')
res = gds.nodeSimilarity.mutate(G, mutateRelationshipType='SIM', mutateProperty='similarity', similarityCutoff=0.1)
res = gds.beta.leiden.write(G, relationshipTypes = ['SIM'], relationshipWeightProperty="similarity", writeProperty="leiden_community")
Gives
neo4j.exceptions.ClientError: {code: Neo.ClientError.Procedure.ProcedureCallFailed} {message: Failed to invoke procedure `gds.beta.leiden.write`: Caused by: java.lang.IllegalArgumentException: The Leiden algorithm works only with undirected graphs. Please orient the edges properly}