Skip to content

Commit c3394bb

Browse files
Mats-SXvnickolov
andcommitted
Remove clusteringCoefficient from triangleCount proc
We will write a new procedure to expose that metric instead Co-authored-by: Veselin Nikolov <[email protected]>
1 parent 97de8bd commit c3394bb

File tree

8 files changed

+71
-219
lines changed

8 files changed

+71
-219
lines changed

algo/src/main/java/org/neo4j/graphalgo/triangle/TriangleCountWriteConfig.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,6 @@
3333
@SuppressWarnings("immutables:subtype")
3434
public interface TriangleCountWriteConfig extends TriangleCountBaseConfig, WritePropertyConfig {
3535

36-
@Configuration.ConvertWith("org.apache.commons.lang3.StringUtils#trimToNull")
37-
String clusteringCoefficientProperty();
38-
3936
static TriangleCountWriteConfig of(
4037
String username,
4138
Optional<String> graphName,

proc/common/src/main/java/org/neo4j/graphalgo/WriteProc.java

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,10 @@
2424
import org.neo4j.graphalgo.core.concurrency.Pools;
2525
import org.neo4j.graphalgo.core.utils.ProgressTimer;
2626
import org.neo4j.graphalgo.core.utils.TerminationFlag;
27-
import org.neo4j.graphalgo.core.write.ImmutableNodeProperty;
2827
import org.neo4j.graphalgo.core.write.NodePropertyExporter;
2928
import org.neo4j.graphalgo.core.write.PropertyTranslator;
3029
import org.neo4j.graphalgo.result.AbstractResultBuilder;
3130

32-
import java.util.Collection;
33-
import java.util.List;
3431
import java.util.stream.Stream;
3532

3633
public abstract class WriteProc<
@@ -73,20 +70,14 @@ private void writeToNeo(
7370
.parallel(Pools.DEFAULT, writePropertyConfig.writeConcurrency())
7471
.build();
7572

76-
exporter.write(nodePropertiesToWrite(computationResult));
73+
exporter.write(
74+
writePropertyConfig.writeProperty(),
75+
computationResult.result(),
76+
nodePropertyTranslator(computationResult)
77+
);
7778

7879
resultBuilder.withNodeCount(computationResult.graph().nodeCount());
7980
resultBuilder.withNodePropertiesWritten(exporter.propertiesWritten());
8081
}
8182
}
82-
83-
protected Collection<NodePropertyExporter.NodeProperty<?>> nodePropertiesToWrite(ComputationResult<ALGO, ALGO_RESULT, CONFIG> computationResult) {
84-
return List.of(
85-
ImmutableNodeProperty.of(
86-
computationResult.config().writeProperty(),
87-
computationResult.result(),
88-
nodePropertyTranslator(computationResult)
89-
)
90-
);
91-
}
9283
}

proc/community/src/main/java/org/neo4j/graphalgo/triangle/TriangleCountMutateProc.java

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
*/
2020
package org.neo4j.graphalgo.triangle;
2121

22-
import org.jetbrains.annotations.Nullable;
2322
import org.neo4j.graphalgo.AlgorithmFactory;
2423
import org.neo4j.graphalgo.MutateProc;
2524
import org.neo4j.graphalgo.config.GraphCreateConfig;
@@ -105,30 +104,27 @@ protected AbstractResultBuilder<MutateResult> resultBuilder(ComputationResult<In
105104
}
106105

107106
public static class MutateResult extends TriangleCountStatsProc.StatsResult {
107+
108+
public long nodePropertiesWritten;
108109
public long mutateMillis;
109110

110111
public MutateResult(
112+
long triangleCount,
113+
long nodeCount,
114+
long nodePropertiesWritten,
111115
long createMillis,
112116
long computeMillis,
113-
long postProcessingMillis,
114117
long mutateMillis,
115-
long nodeCount,
116-
long triangleCount,
117-
double averageClusteringCoefficient,
118-
@Nullable Map<String, Object> communityDistribution,
119118
Map<String, Object> configuration
120119
) {
121120
super(
121+
triangleCount,
122+
nodeCount,
122123
createMillis,
123124
computeMillis,
124-
postProcessingMillis,
125-
nodeCount,
126-
triangleCount,
127-
averageClusteringCoefficient,
128-
communityDistribution,
129125
configuration
130126
);
131-
127+
this.nodePropertiesWritten = nodePropertiesWritten;
132128
this.mutateMillis = mutateMillis;
133129
}
134130
}
@@ -145,14 +141,12 @@ static class TriangleCountMutateBuilder extends TriangleCountCompanion.TriangleC
145141
@Override
146142
protected MutateResult buildResult() {
147143
return new MutateResult(
144+
triangleCount,
145+
nodeCount,
146+
nodePropertiesWritten,
148147
createMillis,
149148
computeMillis,
150-
postProcessingDuration,
151149
mutateMillis,
152-
nodeCount,
153-
triangleCount,
154-
averageClusteringCoefficient,
155-
communityHistogramOrNull(),
156150
config.toMap()
157151
);
158152
}

proc/community/src/main/java/org/neo4j/graphalgo/triangle/TriangleCountStatsProc.java

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
*/
2020
package org.neo4j.graphalgo.triangle;
2121

22-
import org.jetbrains.annotations.Nullable;
2322
import org.neo4j.graphalgo.AlgorithmFactory;
2423
import org.neo4j.graphalgo.StatsProc;
2524
import org.neo4j.graphalgo.config.GraphCreateConfig;
@@ -97,33 +96,23 @@ protected AlgorithmFactory<IntersectingTriangleCount, TriangleCountStatsConfig>
9796
}
9897

9998
public static class StatsResult {
99+
public final long triangleCount;
100+
public final long nodeCount;
100101
public final long createMillis;
101102
public final long computeMillis;
102-
public final long postProcessingMillis;
103-
public final long nodeCount;
104-
public final long triangleCount;
105-
public final double averageClusteringCoefficient;
106-
// TODO: should we retain this?
107-
public final Map<String, Object> communityDistribution;
108103
public final Map<String, Object> configuration;
109104

110105
public StatsResult(
106+
long triangleCount,
107+
long nodeCount,
111108
long createMillis,
112109
long computeMillis,
113-
long postProcessingMillis,
114-
long nodeCount,
115-
long triangleCount,
116-
double averageClusteringCoefficient,
117-
@Nullable Map<String, Object> communityDistribution,
118110
Map<String, Object> configuration
119111
) {
120112
this.createMillis = createMillis;
121113
this.computeMillis = computeMillis;
122-
this.postProcessingMillis = postProcessingMillis;
123114
this.nodeCount = nodeCount;
124-
this.averageClusteringCoefficient = averageClusteringCoefficient;
125115
this.triangleCount = triangleCount;
126-
this.communityDistribution = communityDistribution;
127116
this.configuration = configuration;
128117
}
129118
}
@@ -140,13 +129,10 @@ static class TriangleCountStatsBuilder extends TriangleCountCompanion.TriangleCo
140129
@Override
141130
protected StatsResult buildResult() {
142131
return new StatsResult(
132+
triangleCount,
133+
nodeCount,
143134
createMillis,
144135
computeMillis,
145-
postProcessingDuration,
146-
nodeCount,
147-
triangleCount,
148-
averageClusteringCoefficient,
149-
communityHistogramOrNull(),
150136
config.toMap()
151137
);
152138
}

proc/community/src/main/java/org/neo4j/graphalgo/triangle/TriangleCountWriteProc.java

Lines changed: 9 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,11 @@
1919
*/
2020
package org.neo4j.graphalgo.triangle;
2121

22-
import org.jetbrains.annotations.Nullable;
2322
import org.neo4j.graphalgo.AlgorithmFactory;
2423
import org.neo4j.graphalgo.WriteProc;
2524
import org.neo4j.graphalgo.config.GraphCreateConfig;
2625
import org.neo4j.graphalgo.core.CypherMapWrapper;
2726
import org.neo4j.graphalgo.core.utils.paged.AllocationTracker;
28-
import org.neo4j.graphalgo.core.utils.paged.HugeAtomicLongArray;
29-
import org.neo4j.graphalgo.core.utils.paged.HugeDoubleArray;
30-
import org.neo4j.graphalgo.core.write.ImmutableNodeProperty;
31-
import org.neo4j.graphalgo.core.write.NodePropertyExporter;
3227
import org.neo4j.graphalgo.core.write.PropertyTranslator;
3328
import org.neo4j.graphalgo.result.AbstractResultBuilder;
3429
import org.neo4j.graphalgo.results.MemoryEstimateResult;
@@ -37,8 +32,6 @@
3732
import org.neo4j.procedure.Name;
3833
import org.neo4j.procedure.Procedure;
3934

40-
import java.util.Collection;
41-
import java.util.List;
4235
import java.util.Map;
4336
import java.util.Optional;
4437
import java.util.stream.Stream;
@@ -109,50 +102,25 @@ protected AbstractResultBuilder<WriteResult> resultBuilder(ComputationResult<Int
109102
);
110103
}
111104

112-
@Override
113-
protected Collection<NodePropertyExporter.NodeProperty<?>> nodePropertiesToWrite(ComputationResult<IntersectingTriangleCount, IntersectingTriangleCount.TriangleCountResult, TriangleCountWriteConfig> computationResult) {
114-
TriangleCountWriteConfig config = computationResult.config();
115-
IntersectingTriangleCount.TriangleCountResult result = computationResult.result();
116-
117-
return List.of(
118-
ImmutableNodeProperty.of(
119-
config.writeProperty(),
120-
result.localTriangles(),
121-
HugeAtomicLongArray.Translator.INSTANCE
122-
),
123-
ImmutableNodeProperty.of(
124-
config.clusteringCoefficientProperty(),
125-
result.localClusteringCoefficients(),
126-
HugeDoubleArray.Translator.INSTANCE
127-
)
128-
);
129-
}
130-
131105
public static class WriteResult extends TriangleCountStatsProc.StatsResult {
132106

133-
public long writeMillis;
134107
public long nodePropertiesWritten;
108+
public long writeMillis;
135109

136110
public WriteResult(
111+
long triangleCount,
112+
long nodeCount,
113+
long nodePropertiesWritten,
137114
long createMillis,
138115
long computeMillis,
139116
long writeMillis,
140-
long postProcessingMillis,
141-
long nodeCount,
142-
long triangleCount,
143-
double averageClusteringCoefficient,
144-
long nodePropertiesWritten,
145-
@Nullable Map<String, Object> communityDistribution,
146117
Map<String, Object> configuration
147118
) {
148119
super(
120+
triangleCount,
121+
nodeCount,
149122
createMillis,
150123
computeMillis,
151-
postProcessingMillis,
152-
nodeCount,
153-
triangleCount,
154-
averageClusteringCoefficient,
155-
communityDistribution,
156124
configuration
157125
);
158126

@@ -173,15 +141,12 @@ static class TriangleCountWriteBuilder extends TriangleCountCompanion.TriangleCo
173141
@Override
174142
protected WriteResult buildResult() {
175143
return new WriteResult(
144+
triangleCount,
145+
nodeCount,
146+
nodePropertiesWritten,
176147
createMillis,
177148
computeMillis,
178149
writeMillis,
179-
postProcessingDuration,
180-
nodeCount,
181-
triangleCount,
182-
averageClusteringCoefficient,
183-
nodePropertiesWritten,
184-
communityHistogramOrNull(),
185150
config.toMap()
186151
);
187152
}

proc/community/src/test/java/org/neo4j/graphalgo/triangle/TriangleCountMutateProcTest.java

Lines changed: 14 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,17 @@
2525
import org.neo4j.graphalgo.GraphMutationTest;
2626
import org.neo4j.graphalgo.Orientation;
2727
import org.neo4j.graphalgo.RelationshipProjection;
28-
import org.neo4j.graphalgo.StoreLoaderBuilder;
29-
import org.neo4j.graphalgo.core.Aggregation;
3028
import org.neo4j.graphalgo.core.CypherMapWrapper;
31-
import org.neo4j.graphalgo.core.loading.NativeFactory;
3229
import org.neo4j.values.storable.NumberType;
3330

31+
import java.util.List;
32+
import java.util.Map;
3433
import java.util.Optional;
3534

36-
import static org.hamcrest.MatcherAssert.assertThat;
37-
import static org.hamcrest.Matchers.lessThan;
35+
import static org.hamcrest.Matchers.greaterThan;
36+
import static org.hamcrest.Matchers.isA;
3837
import static org.neo4j.graphalgo.ElementProjection.PROJECT_ALL;
3938
import static org.neo4j.graphalgo.RelationshipType.ALL_RELATIONSHIPS;
40-
import static org.neo4j.graphalgo.TestGraph.Builder.fromGdl;
41-
import static org.neo4j.graphalgo.TestSupport.assertGraphEquals;
4239

4340
class TriangleCountMutateProcTest
4441
extends TriangleCountBaseProcTest<TriangleCountMutateConfig>
@@ -70,7 +67,7 @@ public String expectedMutatedGraph() {
7067
}
7168

7269
@Test
73-
void testMutate() {
70+
void testMutateYields() {
7471
String query = GdsCypher
7572
.call()
7673
.withAnyLabel()
@@ -81,45 +78,17 @@ void testMutate() {
8178
.algo("triangleCount")
8279
.mutateMode()
8380
.addParameter("mutateProperty", mutateProperty())
84-
.yields(
85-
"createMillis",
86-
"computeMillis",
87-
"mutateMillis",
88-
"postProcessingMillis",
89-
"communityDistribution",
90-
"configuration"
91-
);
92-
93-
runQueryWithRowConsumer(
94-
query,
95-
row -> {
96-
assertThat(-1L, lessThan(row.getNumber("createMillis").longValue()));
97-
assertThat(-1L, lessThan(row.getNumber("computeMillis").longValue()));
98-
assertThat(-1L, lessThan(row.getNumber("mutateMillis").longValue()));
99-
}
100-
);
101-
102-
var writeQuery = GdsCypher
103-
.call()
104-
.explicitCreation("g")
105-
.algo("triangleCount")
106-
.writeMode()
107-
.addParameter("writeProperty", mutateProperty())
108-
.addParameter("clusteringCoefficientProperty", "clusteringCoefficient")
10981
.yields();
11082

111-
runQuery(writeQuery);
112-
113-
var updatedGraph = new StoreLoaderBuilder().api(db)
114-
.loadAnyLabel()
115-
.loadAnyRelationshipType()
116-
.globalOrientation(Orientation.UNDIRECTED)
117-
.addNodeProperty(mutateProperty(), mutateProperty(), 42.0, Aggregation.NONE)
118-
.build()
119-
.graph(NativeFactory.class);
120-
121-
assertGraphEquals(fromGdl(expectedMutatedGraph()), updatedGraph);
122-
83+
assertCypherResult(query, List.of(Map.of(
84+
"triangleCount", 1L,
85+
"nodeCount", 3L,
86+
"createMillis", greaterThan(-1L),
87+
"computeMillis", greaterThan(-1L),
88+
"configuration", isA(Map.class),
89+
"mutateMillis", greaterThan(-1L),
90+
"nodePropertiesWritten", 3L
91+
)));
12392
}
12493

12594
@Override
@@ -136,6 +105,4 @@ public TriangleCountMutateConfig createConfig(CypherMapWrapper mapWrapper) {
136105
mapWrapper
137106
);
138107
}
139-
140-
141108
}

0 commit comments

Comments
 (0)