Skip to content

Commit 65ed672

Browse files
Hits write procedure facade
1 parent 693502c commit 65ed672

File tree

12 files changed

+601
-5
lines changed

12 files changed

+601
-5
lines changed

applications/algorithms/centrality/src/main/java/org/neo4j/gds/applications/algorithms/centrality/CentralityAlgorithmsWriteModeBusinessFacade.java

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,13 @@
2929
import org.neo4j.gds.applications.algorithms.machinery.WriteToDatabase;
3030
import org.neo4j.gds.applications.algorithms.metadata.NodePropertiesWritten;
3131
import org.neo4j.gds.articulationpoints.ArticulationPointsWriteConfig;
32+
import org.neo4j.gds.beta.pregel.PregelResult;
3233
import org.neo4j.gds.betweenness.BetweennessCentralityWriteConfig;
3334
import org.neo4j.gds.closeness.ClosenessCentralityWriteConfig;
3435
import org.neo4j.gds.degree.DegreeCentralityWriteConfig;
3536
import org.neo4j.gds.harmonic.HarmonicCentralityWriteConfig;
3637
import org.neo4j.gds.harmonic.HarmonicResult;
38+
import org.neo4j.gds.hits.HitsConfig;
3739
import org.neo4j.gds.influenceMaximization.CELFResult;
3840
import org.neo4j.gds.influenceMaximization.InfluenceMaximizationWriteConfig;
3941
import org.neo4j.gds.logging.Log;
@@ -42,13 +44,17 @@
4244
import org.neo4j.gds.pagerank.PageRankResult;
4345
import org.neo4j.gds.pagerank.PageRankWriteConfig;
4446

47+
import java.util.List;
48+
import java.util.Optional;
49+
4550
import static org.neo4j.gds.applications.algorithms.machinery.AlgorithmLabel.ArticleRank;
4651
import static org.neo4j.gds.applications.algorithms.machinery.AlgorithmLabel.ArticulationPoints;
4752
import static org.neo4j.gds.applications.algorithms.machinery.AlgorithmLabel.BetweennessCentrality;
4853
import static org.neo4j.gds.applications.algorithms.machinery.AlgorithmLabel.CELF;
4954
import static org.neo4j.gds.applications.algorithms.machinery.AlgorithmLabel.ClosenessCentrality;
5055
import static org.neo4j.gds.applications.algorithms.machinery.AlgorithmLabel.DegreeCentrality;
5156
import static org.neo4j.gds.applications.algorithms.machinery.AlgorithmLabel.EigenVector;
57+
import static org.neo4j.gds.applications.algorithms.machinery.AlgorithmLabel.HITS;
5258
import static org.neo4j.gds.applications.algorithms.machinery.AlgorithmLabel.HarmonicCentrality;
5359
import static org.neo4j.gds.applications.algorithms.machinery.AlgorithmLabel.PageRank;
5460

@@ -57,17 +63,21 @@ public final class CentralityAlgorithmsWriteModeBusinessFacade {
5763
private final CentralityAlgorithms centralityAlgorithms;
5864
private final AlgorithmProcessingTemplateConvenience algorithmProcessingTemplateConvenience;
5965
private final WriteToDatabase writeToDatabase;
66+
private final HitsHookGenerator hitsHookGenerator;
67+
6068

6169
private CentralityAlgorithmsWriteModeBusinessFacade(
6270
CentralityAlgorithmsEstimationModeBusinessFacade estimationFacade,
6371
CentralityAlgorithms centralityAlgorithms,
6472
AlgorithmProcessingTemplateConvenience algorithmProcessingTemplateConvenience,
65-
WriteToDatabase writeToDatabase
73+
WriteToDatabase writeToDatabase,
74+
HitsHookGenerator hitsHookGenerator
6675
) {
6776
this.estimationFacade = estimationFacade;
6877
this.centralityAlgorithms = centralityAlgorithms;
6978
this.algorithmProcessingTemplateConvenience = algorithmProcessingTemplateConvenience;
7079
this.writeToDatabase = writeToDatabase;
80+
this.hitsHookGenerator = hitsHookGenerator;
7181
}
7282

7383
public static CentralityAlgorithmsWriteModeBusinessFacade create(
@@ -76,15 +86,17 @@ public static CentralityAlgorithmsWriteModeBusinessFacade create(
7686
WriteContext writeContext,
7787
CentralityAlgorithmsEstimationModeBusinessFacade estimationFacade,
7888
CentralityAlgorithms centralityAlgorithms,
79-
AlgorithmProcessingTemplateConvenience algorithmProcessingTemplateConvenience
89+
AlgorithmProcessingTemplateConvenience algorithmProcessingTemplateConvenience,
90+
HitsHookGenerator hitsHookGenerator
8091
) {
8192
var writeToDatabase = new WriteToDatabase(log, requestScopedDependencies, writeContext);
8293

8394
return new CentralityAlgorithmsWriteModeBusinessFacade(
8495
estimationFacade,
8596
centralityAlgorithms,
8697
algorithmProcessingTemplateConvenience,
87-
writeToDatabase
98+
writeToDatabase,
99+
hitsHookGenerator
88100
);
89101
}
90102

@@ -248,4 +260,26 @@ public <RESULT> RESULT pageRank(
248260
);
249261
}
250262

263+
public <RESULT> RESULT hits(
264+
GraphName graphName,
265+
HitsConfig configuration,
266+
ResultBuilder<HitsConfig, PregelResult, RESULT, NodePropertiesWritten> resultBuilder
267+
) {
268+
var writeStep = new HitsWriteStep(writeToDatabase, configuration, HITS);
269+
var hitsETLHook = hitsHookGenerator.createETLHook(configuration);
270+
271+
return algorithmProcessingTemplateConvenience.processAlgorithmInWriteMode(
272+
Optional.empty(),
273+
graphName,
274+
configuration,
275+
Optional.empty(),
276+
Optional.of(List.of(hitsETLHook)),
277+
HITS,
278+
estimationFacade::hits,
279+
(graph, __) -> centralityAlgorithms.hits(graph, configuration),
280+
writeStep,
281+
resultBuilder
282+
);
283+
}
284+
251285
}

applications/algorithms/centrality/src/main/java/org/neo4j/gds/applications/algorithms/centrality/CentralityApplications.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,8 @@ public static CentralityApplications create(
8989
writeContext,
9090
estimation,
9191
algorithms,
92-
algorithmProcessingTemplateConvenience
92+
algorithmProcessingTemplateConvenience,
93+
hitsHookGenerator
9394
);
9495

9596
return new CentralityApplications(estimation, mutation, stats, streaming, writing);
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
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.centrality;
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.NodePropertyValues;
26+
import org.neo4j.gds.api.properties.nodes.NodePropertyValuesAdapter;
27+
import org.neo4j.gds.applications.algorithms.machinery.Label;
28+
import org.neo4j.gds.applications.algorithms.machinery.WriteStep;
29+
import org.neo4j.gds.applications.algorithms.machinery.WriteToDatabase;
30+
import org.neo4j.gds.applications.algorithms.metadata.NodePropertiesWritten;
31+
import org.neo4j.gds.beta.pregel.PregelResult;
32+
import org.neo4j.gds.core.utils.progress.JobId;
33+
import org.neo4j.gds.hits.HitsConfig;
34+
35+
import java.util.Map;
36+
37+
class HitsWriteStep implements WriteStep<PregelResult, NodePropertiesWritten> {
38+
private final WriteToDatabase writeToDatabase;
39+
private final HitsConfig configuration;
40+
private final Label label;
41+
42+
HitsWriteStep(
43+
WriteToDatabase writeToDatabase,
44+
HitsConfig configuration,
45+
Label label
46+
) {
47+
this.writeToDatabase = writeToDatabase;
48+
this.configuration = configuration;
49+
this.label = label;
50+
}
51+
52+
@Override
53+
public NodePropertiesWritten execute(
54+
Graph graph,
55+
GraphStore graphStore,
56+
ResultStore resultStore,
57+
PregelResult result,
58+
JobId jobId
59+
) {
60+
return writeToDatabase.perform(
61+
graph,
62+
graphStore,
63+
resultStore,
64+
configuration,
65+
label,
66+
jobId,
67+
nodeProperties(result,configuration)
68+
);
69+
}
70+
71+
Map<String,NodePropertyValues> nodeProperties(PregelResult pregelResult, HitsConfig config){
72+
var authValues = NodePropertyValuesAdapter.adapt(pregelResult.nodeValues().doubleProperties(config.authProperty()));
73+
var hubValues = NodePropertyValuesAdapter.adapt(pregelResult.nodeValues().doubleProperties(config.authProperty()));
74+
var authProperty = config.authProperty().concat(config.writeProperty());
75+
var hubProperty = config.hubProperty().concat(config.writeProperty());
76+
return Map.of(authProperty,authValues,hubProperty,hubValues);
77+
}
78+
}

applications/algorithms/machinery/src/main/java/org/neo4j/gds/applications/algorithms/machinery/Neo4jDatabaseNodePropertyWriter.java

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ final class Neo4jDatabaseNodePropertyWriter {
5656

5757
private Neo4jDatabaseNodePropertyWriter() {
5858
}
59-
6059
static NodePropertiesWritten writeNodeProperty(
6160
NodePropertyExporterBuilder nodePropertyExporterBuilder,
6261
TaskRegistryFactory taskRegistryFactory,
@@ -72,6 +71,69 @@ static NodePropertiesWritten writeNodeProperty(
7271
Log log
7372
) {
7473
var nodeProperties = List.of(new NodeProperty(writeProperty, nodePropertyValues));
74+
return writeNodeProperties(
75+
nodePropertyExporterBuilder,
76+
taskRegistryFactory,
77+
graph,
78+
graphStore,
79+
writeConcurrency,
80+
nodeProperties,
81+
procedureName,
82+
resultStore,
83+
jobId,
84+
terminationFlag,
85+
log
86+
);
87+
88+
}
89+
90+
static NodePropertiesWritten writeNodeProperties(
91+
NodePropertyExporterBuilder nodePropertyExporterBuilder,
92+
TaskRegistryFactory taskRegistryFactory,
93+
Graph graph,
94+
GraphStore graphStore,
95+
Concurrency writeConcurrency,
96+
Map<String,NodePropertyValues> nodePropertyValuesMap,
97+
String procedureName,
98+
Optional<ResultStore> resultStore,
99+
JobId jobId,
100+
TerminationFlag terminationFlag,
101+
Log log
102+
) {
103+
var nodeProperties = nodePropertyValuesMap
104+
.entrySet()
105+
.stream()
106+
.map( v-> new NodeProperty(v.getKey(),v.getValue()))
107+
.toList();
108+
109+
return writeNodeProperties(
110+
nodePropertyExporterBuilder,
111+
taskRegistryFactory,
112+
graph,
113+
graphStore,
114+
writeConcurrency,
115+
nodeProperties,
116+
procedureName,
117+
resultStore,
118+
jobId,
119+
terminationFlag,
120+
log
121+
);
122+
}
123+
124+
static NodePropertiesWritten writeNodeProperties(
125+
NodePropertyExporterBuilder nodePropertyExporterBuilder,
126+
TaskRegistryFactory taskRegistryFactory,
127+
Graph graph,
128+
GraphStore graphStore,
129+
Concurrency writeConcurrency,
130+
List<NodeProperty> nodeProperties,
131+
String procedureName,
132+
Optional<ResultStore> resultStore,
133+
JobId jobId,
134+
TerminationFlag terminationFlag,
135+
Log log
136+
) {
75137

76138
var propertiesWritten = new MutableLong();
77139

applications/algorithms/machinery/src/main/java/org/neo4j/gds/applications/algorithms/machinery/WriteToDatabase.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
import org.neo4j.gds.core.utils.progress.JobId;
3030
import org.neo4j.gds.logging.Log;
3131

32+
import java.util.Map;
33+
3234
public class WriteToDatabase {
3335
private final Log log;
3436
private final RequestScopedDependencies requestScopedDependencies;
@@ -65,4 +67,30 @@ public NodePropertiesWritten perform(
6567
log
6668
);
6769
}
70+
71+
public NodePropertiesWritten perform(
72+
Graph graph,
73+
GraphStore graphStore,
74+
ResultStore resultStore,
75+
WriteConfig writeConfiguration,
76+
Label label,
77+
JobId jobId,
78+
Map<String,NodePropertyValues> nodePropertyValuesMap
79+
) {
80+
81+
return Neo4jDatabaseNodePropertyWriter.writeNodeProperties(
82+
writeContext.nodePropertyExporterBuilder(),
83+
requestScopedDependencies.getTaskRegistryFactory(),
84+
graph,
85+
graphStore,
86+
writeConfiguration.writeConcurrency(),
87+
nodePropertyValuesMap,
88+
label.asString(),
89+
writeConfiguration.resolveResultStore(resultStore),
90+
jobId,
91+
requestScopedDependencies.getTerminationFlag(),
92+
log
93+
);
94+
}
95+
6896
}

0 commit comments

Comments
 (0)