Skip to content

Commit 0bf49a6

Browse files
committed
migrate FastRP write
1 parent 0b955f4 commit 0bf49a6

File tree

19 files changed

+295
-154
lines changed

19 files changed

+295
-154
lines changed

algo/src/main/java/org/neo4j/gds/algorithms/embeddings/NodeEmbeddingsAlgorithmsEstimateBusinessFacade.java

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@
2020
package org.neo4j.gds.algorithms.embeddings;
2121

2222
import org.neo4j.gds.algorithms.estimation.AlgorithmEstimator;
23-
import org.neo4j.gds.embeddings.fastrp.FastRPBaseConfig;
24-
import org.neo4j.gds.embeddings.fastrp.FastRPMemoryEstimateDefinition;
23+
import org.neo4j.gds.applications.algorithms.machinery.MemoryEstimateResult;
2524
import org.neo4j.gds.embeddings.graphsage.algo.GraphSageBaseConfig;
2625
import org.neo4j.gds.embeddings.graphsage.algo.GraphSageMemoryEstimateDefinition;
2726
import org.neo4j.gds.embeddings.graphsage.algo.GraphSageTrainConfig;
@@ -31,7 +30,6 @@
3130
import org.neo4j.gds.embeddings.node2vec.Node2VecBaseConfig;
3231
import org.neo4j.gds.embeddings.node2vec.Node2VecMemoryEstimateDefinition;
3332
import org.neo4j.gds.modelcatalogservices.ModelCatalogService;
34-
import org.neo4j.gds.applications.algorithms.machinery.MemoryEstimateResult;
3533

3634
import java.util.Optional;
3735

@@ -92,18 +90,6 @@ public <C extends GraphSageTrainConfig> MemoryEstimateResult graphSageTrain(
9290
);
9391
}
9492

95-
public <C extends FastRPBaseConfig> MemoryEstimateResult fastRP(
96-
Object graphNameOrConfiguration,
97-
C configuration
98-
) {
99-
return algorithmEstimator.estimate(
100-
graphNameOrConfiguration,
101-
configuration,
102-
configuration.relationshipWeightProperty(),
103-
new FastRPMemoryEstimateDefinition(configuration.toParameters())
104-
);
105-
}
106-
10793
public <C extends HashGNNConfig> MemoryEstimateResult hashGNN(
10894
Object graphNameOrConfiguration,
10995
C configuration

algo/src/main/java/org/neo4j/gds/algorithms/embeddings/NodeEmbeddingsAlgorithmsFacade.java

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,6 @@
2323
import org.neo4j.gds.algorithms.runner.AlgorithmRunner;
2424
import org.neo4j.gds.algorithms.validation.AfterLoadValidation;
2525
import org.neo4j.gds.core.model.Model;
26-
import org.neo4j.gds.embeddings.fastrp.FastRPBaseConfig;
27-
import org.neo4j.gds.embeddings.fastrp.FastRPFactory;
28-
import org.neo4j.gds.embeddings.fastrp.FastRPResult;
2926
import org.neo4j.gds.embeddings.graphsage.GraphSageModelTrainer;
3027
import org.neo4j.gds.embeddings.graphsage.ModelData;
3128
import org.neo4j.gds.embeddings.graphsage.algo.GraphSageAlgorithmFactory;
@@ -110,18 +107,6 @@ AlgorithmComputationResult<Model<ModelData, GraphSageTrainConfig, GraphSageModel
110107
);
111108
}
112109

113-
AlgorithmComputationResult<FastRPResult> fastRP(
114-
String graphName,
115-
FastRPBaseConfig config
116-
) {
117-
return algorithmRunner.run(
118-
graphName,
119-
config,
120-
config.relationshipWeightProperty(),
121-
new FastRPFactory<>()
122-
);
123-
}
124-
125110
AlgorithmComputationResult<HashGNNResult> hashGNN(
126111
String graphName,
127112
HashGNNConfig config

algo/src/main/java/org/neo4j/gds/algorithms/embeddings/NodeEmbeddingsAlgorithmsWriteBusinessFacade.java

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,13 @@
2323
import org.neo4j.gds.algorithms.NodePropertyWriteResult;
2424
import org.neo4j.gds.algorithms.embeddings.specificfields.Node2VecSpecificFields;
2525
import org.neo4j.gds.algorithms.runner.AlgorithmRunner;
26-
import org.neo4j.gds.applications.algorithms.machinery.WriteNodePropertyService;
2726
import org.neo4j.gds.api.ResultStore;
2827
import org.neo4j.gds.api.properties.nodes.NodePropertyValues;
2928
import org.neo4j.gds.api.properties.nodes.NodePropertyValuesAdapter;
29+
import org.neo4j.gds.applications.algorithms.machinery.WriteNodePropertyService;
3030
import org.neo4j.gds.config.AlgoBaseConfig;
3131
import org.neo4j.gds.config.ArrowConnectionInfo;
3232
import org.neo4j.gds.core.concurrency.Concurrency;
33-
import org.neo4j.gds.embeddings.fastrp.FastRPWriteConfig;
3433
import org.neo4j.gds.embeddings.graphsage.algo.GraphSageWriteConfig;
3534
import org.neo4j.gds.embeddings.node2vec.Node2VecWriteConfig;
3635

@@ -102,31 +101,6 @@ public NodePropertyWriteResult<Long> graphSage(
102101
);
103102
}
104103

105-
public NodePropertyWriteResult<Long> fastRP(
106-
String graphName,
107-
FastRPWriteConfig configuration
108-
) {
109-
// 1. Run the algorithm and time the execution
110-
var intermediateResult = AlgorithmRunner.runWithTiming(
111-
() -> nodeEmbeddingsAlgorithmsFacade.fastRP(graphName, configuration)
112-
);
113-
114-
return writeToDatabase(
115-
intermediateResult.algorithmResult,
116-
configuration,
117-
(result) -> NodePropertyValuesAdapter.adapt(result.embeddings()),
118-
(result) -> intermediateResult.algorithmResult.graph().nodeCount(),
119-
intermediateResult.computeMilliseconds,
120-
() -> 0L,
121-
"FastRPWrite",
122-
configuration.writeConcurrency(),
123-
configuration.writeProperty(),
124-
configuration.arrowConnectionInfo(),
125-
126-
configuration.resolveResultStore(intermediateResult.algorithmResult.resultStore())
127-
);
128-
}
129-
130104
<RESULT, CONFIG extends AlgoBaseConfig, ASF> NodePropertyWriteResult<ASF> writeToDatabase(
131105
AlgorithmComputationResult<RESULT> algorithmResult,
132106
CONFIG configuration,

applications/algorithms/node-embeddings/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ dependencies {
1010
implementation project(":algorithms-machinery")
1111
implementation project(":config-api")
1212
implementation project(":core")
13+
implementation project(":logging")
1314
implementation project(":memory-usage")
1415
implementation project(":ml-core")
1516
implementation project(":progress-tracking")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/*
2+
* Copyright (c) "Neo4j"
3+
* Neo4j Sweden AB [http://neo4j.com]
4+
*
5+
* This file is part of Neo4j.
6+
*
7+
* Neo4j is free software: you can redistribute it and/or modify
8+
* it under the terms of the GNU General Public License as published by
9+
* the Free Software Foundation, either version 3 of the License, or
10+
* (at your option) any later version.
11+
*
12+
* This program is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
* GNU General Public License for more details.
16+
*
17+
* You should have received a copy of the GNU General Public License
18+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
19+
*/
20+
package org.neo4j.gds.applications.algorithms.embeddings;
21+
22+
import org.neo4j.gds.api.Graph;
23+
import org.neo4j.gds.api.GraphStore;
24+
import org.neo4j.gds.api.ResultStore;
25+
import org.neo4j.gds.api.properties.nodes.NodePropertyValuesAdapter;
26+
import org.neo4j.gds.applications.algorithms.machinery.MutateOrWriteStep;
27+
import org.neo4j.gds.applications.algorithms.machinery.WriteToDatabase;
28+
import org.neo4j.gds.applications.algorithms.metadata.NodePropertiesWritten;
29+
import org.neo4j.gds.core.utils.progress.JobId;
30+
import org.neo4j.gds.embeddings.fastrp.FastRPResult;
31+
import org.neo4j.gds.embeddings.fastrp.FastRPWriteConfig;
32+
33+
import static org.neo4j.gds.applications.algorithms.metadata.LabelForProgressTracking.WCC;
34+
35+
class FastRPWriteStep implements MutateOrWriteStep<FastRPResult, NodePropertiesWritten> {
36+
private final WriteToDatabase writeToDatabase;
37+
private final FastRPWriteConfig configuration;
38+
39+
FastRPWriteStep(WriteToDatabase writeToDatabase, FastRPWriteConfig configuration) {
40+
this.writeToDatabase = writeToDatabase;
41+
this.configuration = configuration;
42+
}
43+
44+
@Override
45+
public NodePropertiesWritten execute(
46+
Graph graph,
47+
GraphStore graphStore,
48+
ResultStore resultStore,
49+
FastRPResult result,
50+
JobId jobId
51+
) {
52+
var nodePropertyValues = NodePropertyValuesAdapter.adapt(result.embeddings());
53+
54+
return writeToDatabase.perform(
55+
graph,
56+
graphStore,
57+
resultStore,
58+
configuration,
59+
configuration,
60+
WCC,
61+
jobId,
62+
nodePropertyValues
63+
);
64+
}
65+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
/*
2+
* Copyright (c) "Neo4j"
3+
* Neo4j Sweden AB [http://neo4j.com]
4+
*
5+
* This file is part of Neo4j.
6+
*
7+
* Neo4j is free software: you can redistribute it and/or modify
8+
* it under the terms of the GNU General Public License as published by
9+
* the Free Software Foundation, either version 3 of the License, or
10+
* (at your option) any later version.
11+
*
12+
* This program is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
* GNU General Public License for more details.
16+
*
17+
* You should have received a copy of the GNU General Public License
18+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
19+
*/
20+
package org.neo4j.gds.applications.algorithms.embeddings;
21+
22+
import org.neo4j.gds.api.GraphName;
23+
import org.neo4j.gds.applications.algorithms.machinery.AlgorithmProcessingTemplate;
24+
import org.neo4j.gds.applications.algorithms.machinery.RequestScopedDependencies;
25+
import org.neo4j.gds.applications.algorithms.machinery.ResultBuilder;
26+
import org.neo4j.gds.applications.algorithms.machinery.WriteNodePropertyService;
27+
import org.neo4j.gds.applications.algorithms.machinery.WriteToDatabase;
28+
import org.neo4j.gds.applications.algorithms.metadata.NodePropertiesWritten;
29+
import org.neo4j.gds.embeddings.fastrp.FastRPResult;
30+
import org.neo4j.gds.embeddings.fastrp.FastRPWriteConfig;
31+
import org.neo4j.gds.logging.Log;
32+
33+
import java.util.Optional;
34+
35+
import static org.neo4j.gds.applications.algorithms.metadata.LabelForProgressTracking.FastRP;
36+
37+
public final class NodeEmbeddingAlgorithmsWriteModeBusinessFacade {
38+
private final NodeEmbeddingAlgorithmsEstimationModeBusinessFacade estimationFacade;
39+
private final NodeEmbeddingAlgorithms algorithms;
40+
private final AlgorithmProcessingTemplate algorithmProcessingTemplate;
41+
private final WriteToDatabase writeToDatabase;
42+
43+
private NodeEmbeddingAlgorithmsWriteModeBusinessFacade(
44+
NodeEmbeddingAlgorithmsEstimationModeBusinessFacade estimationFacade,
45+
NodeEmbeddingAlgorithms algorithms,
46+
AlgorithmProcessingTemplate algorithmProcessingTemplate,
47+
WriteToDatabase writeToDatabase
48+
) {
49+
this.estimationFacade = estimationFacade;
50+
this.algorithms = algorithms;
51+
this.algorithmProcessingTemplate = algorithmProcessingTemplate;
52+
this.writeToDatabase = writeToDatabase;
53+
}
54+
55+
public static NodeEmbeddingAlgorithmsWriteModeBusinessFacade create(
56+
Log log,
57+
RequestScopedDependencies requestScopedDependencies,
58+
NodeEmbeddingAlgorithmsEstimationModeBusinessFacade estimationFacade,
59+
NodeEmbeddingAlgorithms algorithms,
60+
AlgorithmProcessingTemplate algorithmProcessingTemplate
61+
) {
62+
var writeNodePropertyService = new WriteNodePropertyService(log, requestScopedDependencies);
63+
var writeToDatabase = new WriteToDatabase(writeNodePropertyService);
64+
65+
return new NodeEmbeddingAlgorithmsWriteModeBusinessFacade(
66+
estimationFacade,
67+
algorithms,
68+
algorithmProcessingTemplate,
69+
writeToDatabase
70+
);
71+
}
72+
73+
public <RESULT> RESULT fastRP(
74+
GraphName graphName,
75+
FastRPWriteConfig configuration,
76+
ResultBuilder<FastRPWriteConfig, FastRPResult, RESULT, NodePropertiesWritten> resultBuilder
77+
) {
78+
var writeStep = new FastRPWriteStep(writeToDatabase, configuration);
79+
80+
return algorithmProcessingTemplate.processAlgorithm(
81+
graphName,
82+
configuration,
83+
FastRP,
84+
() -> estimationFacade.fastRP(configuration),
85+
graph -> algorithms.fastRP(graph, configuration),
86+
Optional.of(writeStep),
87+
resultBuilder
88+
);
89+
}
90+
}

applications/facade/src/main/java/org/neo4j/gds/applications/ApplicationsFacade.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ public static ApplicationsFacade create(
133133
);
134134

135135
var nodeEmbeddingApplications = NodeEmbeddingApplications.create(
136+
log,
136137
requestScopedDependencies,
137138
algorithmEstimationTemplate,
138139
algorithmProcessingTemplate,

applications/facade/src/main/java/org/neo4j/gds/applications/NodeEmbeddingApplications.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,31 +24,37 @@
2424
import org.neo4j.gds.applications.algorithms.embeddings.NodeEmbeddingAlgorithmsMutateModeBusinessFacade;
2525
import org.neo4j.gds.applications.algorithms.embeddings.NodeEmbeddingAlgorithmsStatsModeBusinessFacade;
2626
import org.neo4j.gds.applications.algorithms.embeddings.NodeEmbeddingAlgorithmsStreamModeBusinessFacade;
27+
import org.neo4j.gds.applications.algorithms.embeddings.NodeEmbeddingAlgorithmsWriteModeBusinessFacade;
2728
import org.neo4j.gds.applications.algorithms.machinery.AlgorithmEstimationTemplate;
2829
import org.neo4j.gds.applications.algorithms.machinery.AlgorithmProcessingTemplate;
2930
import org.neo4j.gds.applications.algorithms.machinery.MutateNodeProperty;
3031
import org.neo4j.gds.applications.algorithms.machinery.ProgressTrackerCreator;
3132
import org.neo4j.gds.applications.algorithms.machinery.RequestScopedDependencies;
33+
import org.neo4j.gds.logging.Log;
3234

3335
public final class NodeEmbeddingApplications {
3436
private final NodeEmbeddingAlgorithmsEstimationModeBusinessFacade estimationMode;
3537
private final NodeEmbeddingAlgorithmsMutateModeBusinessFacade mutateMode;
3638
private final NodeEmbeddingAlgorithmsStatsModeBusinessFacade statsMode;
3739
private final NodeEmbeddingAlgorithmsStreamModeBusinessFacade streamMode;
40+
private final NodeEmbeddingAlgorithmsWriteModeBusinessFacade writeMode;
3841

3942
private NodeEmbeddingApplications(
4043
NodeEmbeddingAlgorithmsEstimationModeBusinessFacade estimationMode,
4144
NodeEmbeddingAlgorithmsMutateModeBusinessFacade mutateMode,
4245
NodeEmbeddingAlgorithmsStatsModeBusinessFacade statsMode,
43-
NodeEmbeddingAlgorithmsStreamModeBusinessFacade streamMode
46+
NodeEmbeddingAlgorithmsStreamModeBusinessFacade streamMode,
47+
NodeEmbeddingAlgorithmsWriteModeBusinessFacade writeMode
4448
) {
4549
this.estimationMode = estimationMode;
4650
this.mutateMode = mutateMode;
4751
this.statsMode = statsMode;
4852
this.streamMode = streamMode;
53+
this.writeMode = writeMode;
4954
}
5055

5156
static NodeEmbeddingApplications create(
57+
Log log,
5258
RequestScopedDependencies requestScopedDependencies,
5359
AlgorithmEstimationTemplate algorithmEstimationTemplate,
5460
AlgorithmProcessingTemplate algorithmProcessingTemplate,
@@ -77,8 +83,15 @@ static NodeEmbeddingApplications create(
7783
algorithms,
7884
algorithmProcessingTemplate
7985
);
86+
var writeMode = NodeEmbeddingAlgorithmsWriteModeBusinessFacade.create(
87+
log,
88+
requestScopedDependencies,
89+
estimationMode,
90+
algorithms,
91+
algorithmProcessingTemplate
92+
);
8093

81-
return new NodeEmbeddingApplications(estimationMode, mutateMode, statsMode, streamMode);
94+
return new NodeEmbeddingApplications(estimationMode, mutateMode, statsMode, streamMode, writeMode);
8295
}
8396

8497
public NodeEmbeddingAlgorithmsEstimationModeBusinessFacade estimate() {
@@ -96,4 +109,8 @@ public NodeEmbeddingAlgorithmsStatsModeBusinessFacade stats() {
96109
public NodeEmbeddingAlgorithmsStreamModeBusinessFacade stream() {
97110
return streamMode;
98111
}
112+
113+
public NodeEmbeddingAlgorithmsWriteModeBusinessFacade write() {
114+
return writeMode;
115+
}
99116
}

proc/embeddings/src/main/java/org/neo4j/gds/embeddings/fastrp/FastRPWriteProc.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
import org.neo4j.gds.applications.algorithms.machinery.MemoryEstimateResult;
2323
import org.neo4j.gds.procedures.GraphDataScienceProcedures;
24-
import org.neo4j.gds.procedures.embeddings.results.DefaultNodeEmbeddingsWriteResult;
24+
import org.neo4j.gds.procedures.algorithms.embeddings.DefaultNodeEmbeddingsWriteResult;
2525
import org.neo4j.procedure.Context;
2626
import org.neo4j.procedure.Description;
2727
import org.neo4j.procedure.Name;
@@ -45,7 +45,7 @@ public Stream<DefaultNodeEmbeddingsWriteResult> write(
4545
@Name(value = "graphName") String graphName,
4646
@Name(value = "configuration", defaultValue = "{}") Map<String, Object> configuration
4747
) {
48-
return facade.oldNodeEmbeddings().fastRP().write(graphName, configuration);
48+
return facade.algorithms().nodeEmbeddings().fastRPWrite(graphName, configuration);
4949
}
5050

5151
@Procedure(value = "gds.fastRP.write.estimate", mode = READ)
@@ -54,6 +54,6 @@ public Stream<MemoryEstimateResult> estimate(
5454
@Name(value = "graphNameOrConfiguration") Object graphNameOrConfiguration,
5555
@Name(value = "algoConfiguration") Map<String, Object> algoConfiguration
5656
) {
57-
return facade.oldNodeEmbeddings().fastRP().writeEstimate(graphNameOrConfiguration, algoConfiguration);
57+
return facade.algorithms().nodeEmbeddings().fastRPWriteEstimate(graphNameOrConfiguration, algoConfiguration);
5858
}
5959
}

proc/embeddings/src/main/java/org/neo4j/gds/embeddings/fastrp/FastRPWriteSpec.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import org.neo4j.gds.executor.ExecutionMode;
2727
import org.neo4j.gds.executor.GdsCallable;
2828
import org.neo4j.gds.procedures.algorithms.configuration.NewConfigFunction;
29-
import org.neo4j.gds.procedures.embeddings.results.DefaultNodeEmbeddingsWriteResult;
29+
import org.neo4j.gds.procedures.algorithms.embeddings.DefaultNodeEmbeddingsWriteResult;
3030

3131
import java.util.stream.Stream;
3232

0 commit comments

Comments
 (0)