Skip to content

Commit ddb8bed

Browse files
committed
Refactor GraphStoreValidation
1 parent 913eae1 commit ddb8bed

File tree

31 files changed

+254
-227
lines changed

31 files changed

+254
-227
lines changed

algorithms-compute-business-facade/src/main/java/org/neo4j/gds/community/CommunityComputeBusinessFacade.java

Lines changed: 36 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,21 @@
3030
import org.neo4j.gds.cliqueCounting.CliqueCountingResult;
3131
import org.neo4j.gds.cliquecounting.CliqueCountingParameters;
3232
import org.neo4j.gds.collections.ha.HugeLongArray;
33-
import org.neo4j.gds.community.validation.ApproxMaxKCutValidation;
34-
import org.neo4j.gds.community.validation.SpeakerListenerLPAGraphStoreValidation;
35-
import org.neo4j.gds.community.validation.TriangleCountGraphStoreValidation;
33+
import org.neo4j.gds.community.validation.MinCommunitySizeSumRequirement;
34+
import org.neo4j.gds.community.validation.SpeakerListenerLPAGraphStoreRequirements;
35+
import org.neo4j.gds.community.validation.TriangleCountGraphStoreRequirements;
3636
import org.neo4j.gds.conductance.ConductanceParameters;
3737
import org.neo4j.gds.conductance.ConductanceResult;
3838
import org.neo4j.gds.core.JobId;
3939
import org.neo4j.gds.core.loading.GraphStoreCatalogService;
40-
import org.neo4j.gds.core.loading.validation.CompoundGraphStoreValidationsBuilder;
41-
import org.neo4j.gds.core.loading.validation.NoAlgorithmValidation;
42-
import org.neo4j.gds.core.loading.validation.NodePropertyAllExistsGraphStoreValidation;
43-
import org.neo4j.gds.core.loading.validation.NodePropertyAnyExistsGraphStoreValidation;
44-
import org.neo4j.gds.core.loading.validation.NodePropertyTypeGraphStoreValidation;
45-
import org.neo4j.gds.core.loading.validation.SeedPropertyGraphStoreValidation;
46-
import org.neo4j.gds.core.loading.validation.UndirectedOnlyGraphStoreValidation;
40+
import org.neo4j.gds.core.loading.validation.AlgorithmGraphStoreRequirementsBuilder;
41+
import org.neo4j.gds.core.loading.validation.GraphStoreValidation;
42+
import org.neo4j.gds.core.loading.validation.NoAlgorithmRequirements;
43+
import org.neo4j.gds.core.loading.validation.NodePropertyMustExistOnAllLabels;
44+
import org.neo4j.gds.core.loading.validation.NodePropertyMustExistOnAnyLabel;
45+
import org.neo4j.gds.core.loading.validation.NodePropertyTypeRequirement;
46+
import org.neo4j.gds.core.loading.validation.SeedPropertyGraphStoreRequirement;
47+
import org.neo4j.gds.core.loading.validation.UndirectedOnlyRequirement;
4748
import org.neo4j.gds.core.utils.paged.dss.DisjointSetStruct;
4849
import org.neo4j.gds.hdbscan.HDBScanParameters;
4950
import org.neo4j.gds.hdbscan.Labels;
@@ -115,7 +116,7 @@ public <TR> CompletableFuture<TR> approxMaxKCut(
115116
graphName,
116117
graphParameters,
117118
relationshipProperty,
118-
new ApproxMaxKCutValidation(parameters.minCommunitySizes()),
119+
new GraphStoreValidation(new MinCommunitySizeSumRequirement(parameters.minCommunitySizes())),
119120
Optional.empty(),
120121
user,
121122
databaseId
@@ -144,7 +145,7 @@ public <TR> CompletableFuture<TR> cliqueCounting(
144145
graphName,
145146
graphParameters,
146147
Optional.empty(),
147-
new UndirectedOnlyGraphStoreValidation("Clique Counting"),
148+
new GraphStoreValidation(new UndirectedOnlyRequirement("Clique Counting")),
148149
Optional.empty(),
149150
user,
150151
databaseId
@@ -174,7 +175,7 @@ public <TR> CompletableFuture<TR> conductance(
174175
graphName,
175176
graphParameters,
176177
relationshipProperty,
177-
new NodePropertyAnyExistsGraphStoreValidation("communityProperty"),
178+
new GraphStoreValidation(new NodePropertyMustExistOnAnyLabel("communityProperty")),
178179
Optional.empty(),
179180
user,
180181
databaseId
@@ -203,7 +204,7 @@ public <TR> CompletableFuture<TR> hdbscan(
203204
graphName,
204205
graphParameters,
205206
Optional.empty(),
206-
new NodePropertyAnyExistsGraphStoreValidation("nodeProperty"),
207+
new GraphStoreValidation(new NodePropertyMustExistOnAnyLabel("nodeProperty")),
207208
Optional.empty(),
208209
user,
209210
databaseId
@@ -232,7 +233,7 @@ public <TR> CompletableFuture<TR> k1Coloring(
232233
graphName,
233234
graphParameters,
234235
Optional.empty(),
235-
new NoAlgorithmValidation(),
236+
new GraphStoreValidation(new NoAlgorithmRequirements()),
236237
Optional.empty(),
237238
user,
238239
databaseId
@@ -261,7 +262,7 @@ public <TR> CompletableFuture<TR> kCoreDecomposition(
261262
graphName,
262263
graphParameters,
263264
Optional.empty(),
264-
new UndirectedOnlyGraphStoreValidation("K-Core-Decomposition"),
265+
new GraphStoreValidation(new UndirectedOnlyRequirement("K-Core-Decomposition")),
265266
Optional.empty(),
266267
user,
267268
databaseId
@@ -290,10 +291,10 @@ public <TR> CompletableFuture<TR> kMeans(
290291
graphName,
291292
graphParameters,
292293
Optional.empty(),
293-
new NodePropertyTypeGraphStoreValidation(
294+
new GraphStoreValidation(new NodePropertyTypeRequirement(
294295
"nodeProperty",
295296
List.of(ValueType.DOUBLE_ARRAY, ValueType.FLOAT_ARRAY, ValueType.DOUBLE)
296-
),
297+
)),
297298
Optional.empty(),
298299
user,
299300
databaseId
@@ -323,9 +324,9 @@ public <TR> CompletableFuture<TR> labelPropagation(
323324
graphName,
324325
graphParameters,
325326
relationshipProperty,
326-
new CompoundGraphStoreValidationsBuilder()
327-
.withGraphStoreValidation(SeedPropertyGraphStoreValidation.create(parameters.seedProperty()))
328-
.withGraphStoreValidation(new NodePropertyAllExistsGraphStoreValidation(parameters.nodeWeightProperty()))
327+
new AlgorithmGraphStoreRequirementsBuilder()
328+
.withAlgorithmRequirement(SeedPropertyGraphStoreRequirement.create(Optional.ofNullable(parameters.seedProperty())))
329+
.withAlgorithmRequirement(new NodePropertyMustExistOnAllLabels(parameters.nodeWeightProperty()))
329330
.build(),
330331
Optional.empty(),
331332
user,
@@ -355,9 +356,9 @@ public <TR> CompletableFuture<TR> lcc(
355356
graphName,
356357
graphParameters,
357358
Optional.empty(),
358-
new CompoundGraphStoreValidationsBuilder()
359-
.withGraphStoreValidation(new UndirectedOnlyGraphStoreValidation("LocalClusteringCoefficient"))
360-
.withGraphStoreValidation(SeedPropertyGraphStoreValidation.create(parameters.seedProperty()))
359+
new AlgorithmGraphStoreRequirementsBuilder()
360+
.withAlgorithmRequirement(new UndirectedOnlyRequirement("LocalClusteringCoefficient"))
361+
.withAlgorithmRequirement(SeedPropertyGraphStoreRequirement.create(Optional.ofNullable(parameters.seedProperty())))
361362
.build(),
362363
Optional.empty(),
363364
user,
@@ -388,9 +389,9 @@ public <TR> CompletableFuture<TR> leiden(
388389
graphName,
389390
graphParameters,
390391
relationshipProperty,
391-
new CompoundGraphStoreValidationsBuilder()
392-
.withGraphStoreValidation(new UndirectedOnlyGraphStoreValidation("Leiden"))
393-
.withGraphStoreValidation(SeedPropertyGraphStoreValidation.create(parameters.seedProperty()))
392+
new AlgorithmGraphStoreRequirementsBuilder()
393+
.withAlgorithmRequirement(new UndirectedOnlyRequirement("Leiden"))
394+
.withAlgorithmRequirement(SeedPropertyGraphStoreRequirement.create(Optional.ofNullable(parameters.seedProperty())))
394395
.build(),
395396
Optional.empty(),
396397
user,
@@ -421,7 +422,7 @@ public <TR> CompletableFuture<TR> louvain(
421422
graphName,
422423
graphParameters,
423424
relationshipProperty,
424-
SeedPropertyGraphStoreValidation.create(parameters.seedProperty()),
425+
new GraphStoreValidation(SeedPropertyGraphStoreRequirement.create(Optional.ofNullable(parameters.seedProperty()))),
425426
Optional.empty(),
426427
user,
427428
databaseId
@@ -450,7 +451,7 @@ public <TR> CompletableFuture<TR> modularity(
450451
graphName,
451452
graphParameters,
452453
relationshipProperty,
453-
new NodePropertyAnyExistsGraphStoreValidation("communityProperty"),
454+
new GraphStoreValidation(new NodePropertyMustExistOnAnyLabel("communityProperty")),
454455
Optional.empty(),
455456
user,
456457
databaseId
@@ -479,7 +480,7 @@ public <TR> CompletableFuture<TR> modularityOptimization(
479480
graphName,
480481
graphParameters,
481482
relationshipProperty,
482-
SeedPropertyGraphStoreValidation.create(parameters.seedProperty().orElse(null)),
483+
new GraphStoreValidation(SeedPropertyGraphStoreRequirement.create(parameters.seedProperty())),
483484
Optional.empty(),
484485
user,
485486
databaseId
@@ -508,7 +509,7 @@ public <TR> CompletableFuture<TR> scc(
508509
graphName,
509510
graphParameters,
510511
Optional.empty(),
511-
new NoAlgorithmValidation(),
512+
new GraphStoreValidation(new NoAlgorithmRequirements()),
512513
Optional.empty(),
513514
user,
514515
databaseId
@@ -537,7 +538,7 @@ public <TR> CompletableFuture<TR> sllpa(
537538
graphName,
538539
graphParameters,
539540
Optional.empty(),
540-
new SpeakerListenerLPAGraphStoreValidation(config.writeProperty()),
541+
new GraphStoreValidation(new SpeakerListenerLPAGraphStoreRequirements(config.writeProperty())),
541542
Optional.empty(),
542543
user,
543544
databaseId
@@ -565,7 +566,7 @@ public <TR> CompletableFuture<TR> triangleCount(
565566
graphName,
566567
graphParameters,
567568
Optional.empty(),
568-
TriangleCountGraphStoreValidation.create(parameters.labelFilter()),
569+
new GraphStoreValidation(TriangleCountGraphStoreRequirements.create(parameters.labelFilter())),
569570
Optional.empty(),
570571
user,
571572
databaseId
@@ -594,7 +595,7 @@ public <TR> CompletableFuture<TR> triangles(
594595
graphName,
595596
graphParameters,
596597
Optional.empty(),
597-
TriangleCountGraphStoreValidation.create(parameters.labelFilter()),
598+
new GraphStoreValidation(TriangleCountGraphStoreRequirements.create(parameters.labelFilter())),
598599
Optional.empty(),
599600
user,
600601
databaseId
@@ -622,7 +623,7 @@ public <TR> CompletableFuture<TR> wcc(
622623
graphName,
623624
graphParameters,
624625
relationshipProperty,
625-
SeedPropertyGraphStoreValidation.create(parameters.seedProperty().orElse(null)),
626+
new GraphStoreValidation(SeedPropertyGraphStoreRequirement.create(parameters.seedProperty())),
626627
Optional.empty(),
627628
user,
628629
databaseId

algorithms-compute-business-facade/src/main/java/org/neo4j/gds/community/validation/ApproxMaxKCutValidation.java renamed to algorithms-compute-business-facade/src/main/java/org/neo4j/gds/community/validation/MinCommunitySizeSumRequirement.java

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,32 +22,23 @@
2222
import org.neo4j.gds.NodeLabel;
2323
import org.neo4j.gds.RelationshipType;
2424
import org.neo4j.gds.api.GraphStore;
25-
import org.neo4j.gds.core.loading.validation.GraphStoreValidation;
25+
import org.neo4j.gds.core.loading.validation.AlgorithmGraphStoreRequirements;
2626

2727
import java.util.Collection;
28-
import java.util.List;
2928

3029
import static org.neo4j.gds.utils.StringFormatting.formatWithLocale;
3130

32-
public class ApproxMaxKCutValidation extends GraphStoreValidation {
33-
34-
private final List<Long> minCommunitySizes;
35-
36-
public ApproxMaxKCutValidation(List<Long> minCommunitySizes) {
37-
this.minCommunitySizes = minCommunitySizes;
38-
}
31+
public class MinCommunitySizeSumRequirement implements AlgorithmGraphStoreRequirements {
32+
private final Collection<Long> minCommunitySizes;
3933

34+
public MinCommunitySizeSumRequirement(Collection<Long> minCommunitySizes) {this.minCommunitySizes = minCommunitySizes;}
4035

4136
@Override
42-
protected void validateAlgorithmRequirements(
37+
public void validate(
4338
GraphStore graphStore,
4439
Collection<NodeLabel> selectedLabels,
4540
Collection<RelationshipType> selectedRelationshipTypes
4641
) {
47-
validateMinCommunitySizesSum(graphStore);
48-
}
49-
50-
void validateMinCommunitySizesSum(GraphStore graphStore) {
5142
long minCommunitySizesSum = minCommunitySizes.stream().mapToLong(Long::valueOf).sum();
5243
long halfNodeCount = graphStore.nodeCount() / 2;
5344
if (minCommunitySizesSum > halfNodeCount) {

algorithms-compute-business-facade/src/main/java/org/neo4j/gds/community/validation/SpeakerListenerLPAGraphStoreValidation.java renamed to algorithms-compute-business-facade/src/main/java/org/neo4j/gds/community/validation/SpeakerListenerLPAGraphStoreRequirements.java

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,28 +22,24 @@
2222
import org.neo4j.gds.NodeLabel;
2323
import org.neo4j.gds.RelationshipType;
2424
import org.neo4j.gds.api.GraphStore;
25-
import org.neo4j.gds.core.loading.validation.GraphStoreValidation;
25+
import org.neo4j.gds.core.loading.validation.AlgorithmGraphStoreRequirements;
2626

2727
import java.util.Collection;
2828

29-
public class SpeakerListenerLPAGraphStoreValidation extends GraphStoreValidation {
29+
public class SpeakerListenerLPAGraphStoreRequirements implements AlgorithmGraphStoreRequirements {
3030

3131
private final String writeProperty;
3232

33-
public SpeakerListenerLPAGraphStoreValidation(String writeProperty) {
33+
public SpeakerListenerLPAGraphStoreRequirements(String writeProperty) {
3434
this.writeProperty = writeProperty;
3535
}
3636

3737
@Override
38-
protected void validateAlgorithmRequirements(
38+
public void validate(
3939
GraphStore graphStore,
4040
Collection<NodeLabel> selectedLabels,
4141
Collection<RelationshipType> selectedRelationshipTypes
4242
) {
43-
validateCanWrite(graphStore);
44-
}
45-
46-
private void validateCanWrite(GraphStore graphStore) {
4743
// See PregelProcedureConfig for exaplanation of this
4844
if (writeProperty.isBlank()) {
4945
return;
@@ -54,4 +50,5 @@ private void validateCanWrite(GraphStore graphStore) {
5450
throw new IllegalArgumentException("The provided graph does not support `write` execution mode.");
5551
}
5652
}
53+
5754
}

algorithms-compute-business-facade/src/main/java/org/neo4j/gds/community/validation/TriangleCountGraphStoreValidation.java renamed to algorithms-compute-business-facade/src/main/java/org/neo4j/gds/community/validation/TriangleCountGraphStoreRequirements.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,28 +22,28 @@
2222
import org.neo4j.gds.NodeLabel;
2323
import org.neo4j.gds.RelationshipType;
2424
import org.neo4j.gds.api.GraphStore;
25-
import org.neo4j.gds.core.loading.validation.GraphStoreValidation;
26-
import org.neo4j.gds.core.loading.validation.UndirectedOnlyGraphStoreValidation;
25+
import org.neo4j.gds.core.loading.validation.AlgorithmGraphStoreRequirements;
26+
import org.neo4j.gds.core.loading.validation.UndirectedOnlyRequirement;
2727

2828
import java.util.Collection;
2929
import java.util.List;
3030

3131
import static org.neo4j.gds.utils.StringFormatting.formatWithLocale;
3232

33-
public final class TriangleCountGraphStoreValidation extends GraphStoreValidation {
33+
public final class TriangleCountGraphStoreRequirements implements AlgorithmGraphStoreRequirements {
3434

35-
private final UndirectedOnlyGraphStoreValidation undirectedOnlyGraphStoreValidation;
35+
private final UndirectedOnlyRequirement undirectedOnlyGraphStoreValidation;
3636
private final List<String> labelFilter;
3737

38-
public static TriangleCountGraphStoreValidation create(List<String> labelFilter) {
39-
return new TriangleCountGraphStoreValidation(
40-
new UndirectedOnlyGraphStoreValidation("Triangle Counting"),
38+
public static TriangleCountGraphStoreRequirements create(List<String> labelFilter) {
39+
return new TriangleCountGraphStoreRequirements(
40+
new UndirectedOnlyRequirement("Triangle Counting"),
4141
labelFilter
4242
);
4343
}
4444

45-
private TriangleCountGraphStoreValidation(
46-
UndirectedOnlyGraphStoreValidation undirectedOnlyGraphStoreValidation,
45+
private TriangleCountGraphStoreRequirements(
46+
UndirectedOnlyRequirement undirectedOnlyGraphStoreValidation,
4747
List<String> labelFilter
4848
) {
4949
this.undirectedOnlyGraphStoreValidation = undirectedOnlyGraphStoreValidation;
@@ -52,12 +52,12 @@ private TriangleCountGraphStoreValidation(
5252

5353

5454
@Override
55-
protected void validateAlgorithmRequirements(
55+
public void validate(
5656
GraphStore graphStore,
5757
Collection<NodeLabel> selectedLabels,
5858
Collection<RelationshipType> selectedRelationshipTypes
5959
) {
60-
undirectedOnlyGraphStoreValidation.validateAlgorithmRequirements(
60+
undirectedOnlyGraphStoreValidation.validate(
6161
graphStore,
6262
selectedLabels,
6363
selectedRelationshipTypes

algorithms-compute-business-facade/src/main/java/org/neo4j/gds/embeddings/NodeEmbeddingComputeBusinessFacade.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@
2323
import org.neo4j.gds.api.DatabaseId;
2424
import org.neo4j.gds.api.GraphName;
2525
import org.neo4j.gds.api.User;
26-
import org.neo4j.gds.core.loading.GraphStoreCatalogService;
27-
import org.neo4j.gds.core.loading.validation.NoAlgorithmValidation;
2826
import org.neo4j.gds.core.JobId;
27+
import org.neo4j.gds.core.loading.GraphStoreCatalogService;
28+
import org.neo4j.gds.core.loading.validation.GraphStoreValidation;
29+
import org.neo4j.gds.core.loading.validation.NoAlgorithmRequirements;
2930
import org.neo4j.gds.embeddings.fastrp.FastRPParameters;
3031
import org.neo4j.gds.embeddings.fastrp.FastRPResult;
3132
import org.neo4j.gds.embeddings.hashgnn.HashGNNParameters;
@@ -78,7 +79,7 @@ public <TR> CompletableFuture<TR> fastRP(
7879
graphName,
7980
graphParameters,
8081
relationshipProperty,
81-
new FeaturePropertiesMustExistOnAllNodeLabels(parameters.featureProperties()),
82+
new GraphStoreValidation(new FeaturePropertiesMustExistOnAllNodeLabels(parameters.featureProperties())),
8283
Optional.empty(),
8384
user,
8485
databaseId
@@ -107,7 +108,7 @@ public <TR> CompletableFuture<TR> hashGnn(
107108
graphName,
108109
graphParameters,
109110
Optional.empty(),
110-
new FeaturePropertiesMustExistOnAllNodeLabels(parameters.featureProperties()),
111+
new GraphStoreValidation(new FeaturePropertiesMustExistOnAllNodeLabels(parameters.featureProperties())),
111112
Optional.empty(),
112113
user,
113114
databaseId
@@ -136,7 +137,7 @@ public <TR> CompletableFuture<TR> node2Vec(
136137
graphName,
137138
graphParameters,
138139
relationshipProperty,
139-
new NoAlgorithmValidation(),
140+
new GraphStoreValidation(new NoAlgorithmRequirements()),
140141
Optional.of(new Node2VecGraphValidation(
141142
parameters.samplingWalkParameters().walksPerNode(),
142143
parameters.samplingWalkParameters().walkLength()

0 commit comments

Comments
 (0)