File tree Expand file tree Collapse file tree 4 files changed +71
-1
lines changed
algorithms-compute-facade/src
main/java/org/neo4j/gds/community
algo/src/main/java/org/neo4j/gds/modularity Expand file tree Collapse file tree 4 files changed +71
-1
lines changed Original file line number Diff line number Diff line change @@ -27,4 +27,13 @@ public record ModularityResult(
2727 double totalModularity ,
2828 long communityCount ,
2929 HugeObjectArray <CommunityModularity > modularityScores
30- ) { }
30+ ) {
31+
32+ public static ModularityResult EMPTY = new ModularityResult (
33+ 0 ,
34+ 0 ,
35+ 0 ,
36+ 0 ,
37+ HugeObjectArray .newArray (CommunityModularity .class ,0 )
38+ );
39+ }
Original file line number Diff line number Diff line change 5757import org .neo4j .gds .louvain .Louvain ;
5858import org .neo4j .gds .louvain .LouvainParameters ;
5959import org .neo4j .gds .louvain .LouvainResult ;
60+ import org .neo4j .gds .modularity .ModularityCalculator ;
61+ import org .neo4j .gds .modularity .ModularityParameters ;
62+ import org .neo4j .gds .modularity .ModularityResult ;
6063import org .neo4j .gds .result .TimedAlgorithmResult ;
6164import org .neo4j .gds .termination .TerminationFlag ;
6265import org .neo4j .gds .triangle .LocalClusteringCoefficient ;
@@ -448,4 +451,26 @@ CompletableFuture<TimedAlgorithmResult<LouvainResult>> louvain(
448451 );
449452 }
450453
454+ CompletableFuture <TimedAlgorithmResult <ModularityResult >> modularity (
455+ Graph graph ,
456+ ModularityParameters parameters ,
457+ JobId jobId
458+ ) {
459+
460+ if (graph .isEmpty ()) {
461+ return CompletableFuture .completedFuture (TimedAlgorithmResult .empty (ModularityResult .EMPTY ));
462+ }
463+
464+ var algorithm = ModularityCalculator .create (
465+ graph ,
466+ graph .nodeProperties (parameters .communityProperty ())::longValue ,
467+ parameters .concurrency ()
468+ );
469+
470+ return algorithmCaller .run (
471+ algorithm ::compute ,
472+ jobId
473+ );
474+ }
475+
451476}
Original file line number Diff line number Diff line change 4747import org .neo4j .gds .leiden .LeidenResult ;
4848import org .neo4j .gds .louvain .LouvainParameters ;
4949import org .neo4j .gds .louvain .LouvainResult ;
50+ import org .neo4j .gds .modularity .ModularityParameters ;
51+ import org .neo4j .gds .modularity .ModularityResult ;
5052import org .neo4j .gds .termination .TerminationFlag ;
5153import org .neo4j .gds .triangle .LocalClusteringCoefficientParameters ;
5254import org .neo4j .gds .triangle .LocalClusteringCoefficientResult ;
@@ -268,4 +270,20 @@ void louvain(){
268270 verifyNoInteractions (progressTrackerFactoryMock );
269271 verifyNoInteractions (algorithmCallerMock );
270272 }
273+
274+ @ Test
275+ void modularity (){
276+
277+ var future = facade .modularity (
278+ graph ,
279+ mock (ModularityParameters .class ),
280+ jobIdMock
281+ );
282+
283+ var results = future .join ();
284+
285+ assertThat (results .result ()).isEqualTo (ModularityResult .EMPTY );
286+ verifyNoInteractions (progressTrackerFactoryMock );
287+ verifyNoInteractions (algorithmCallerMock );
288+ }
271289}
Original file line number Diff line number Diff line change 4848import org .neo4j .gds .leiden .LeidenParameters ;
4949import org .neo4j .gds .logging .Log ;
5050import org .neo4j .gds .louvain .LouvainParameters ;
51+ import org .neo4j .gds .modularity .ModularityParameters ;
5152import org .neo4j .gds .termination .TerminationFlag ;
5253import org .neo4j .gds .triangle .LocalClusteringCoefficientParameters ;
5354
@@ -336,4 +337,21 @@ void louvain(){
336337 assertThat (results .computeMillis ()).isNotNegative ();
337338 }
338339
340+ @ Test
341+ void modularity (){
342+ var future = facade .modularity (
343+ graph ,
344+ new ModularityParameters (
345+ "prop" ,
346+ new Concurrency (4 )
347+ ),
348+ jobIdMock
349+ );
350+
351+ var results = future .join ();
352+
353+ assertThat (results .result ().nodeCount ()).isEqualTo (3 );
354+ assertThat (results .computeMillis ()).isNotNegative ();
355+ }
356+
339357}
You can’t perform that action at this time.
0 commit comments