Skip to content

Commit 6ef3d94

Browse files
Do not compute histogram when using LOG scaler
1 parent ba2451a commit 6ef3d94

File tree

3 files changed

+52
-6
lines changed

3 files changed

+52
-6
lines changed

algo-common/src/main/java/org/neo4j/gds/result/AbstractCentralityResultBuilder.java

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,26 @@
2525
import org.neo4j.gds.core.concurrency.Pools;
2626
import org.neo4j.gds.core.utils.ProgressTimer;
2727
import org.neo4j.gds.core.utils.statistics.CentralityStatistics;
28+
import org.neo4j.gds.scaling.ScalarScaler;
2829
import org.neo4j.internal.kernel.api.procs.ProcedureCallContext;
2930

31+
import java.util.HashMap;
3032
import java.util.Map;
3133
import java.util.Optional;
3234
import java.util.function.LongToDoubleFunction;
3335

3436
public abstract class AbstractCentralityResultBuilder<WRITE_RESULT> extends AbstractResultBuilder<WRITE_RESULT> {
3537

38+
private static final String HISTOGRAM_ERROR_KEY = "Error";
39+
3640
private final int concurrency;
3741
protected boolean buildHistogram;
3842

3943
protected long postProcessingMillis = -1L;
4044
protected Optional<DoubleHistogram> maybeCentralityHistogram = Optional.empty();
4145

46+
protected Map<String, Object> histogramError;
47+
4248
protected @Nullable Map<String, Object> centralityHistogramOrNull() {
4349
return maybeCentralityHistogram.map(histogram -> MapUtil.map(
4450
"min", histogram.getMinValue(),
@@ -50,10 +56,11 @@ public abstract class AbstractCentralityResultBuilder<WRITE_RESULT> extends Abst
5056
"p95", histogram.getValueAtPercentile(95),
5157
"p99", histogram.getValueAtPercentile(99),
5258
"p999", histogram.getValueAtPercentile(99.9)
53-
)).orElse(null);
59+
)).orElse(histogramError);
5460
}
5561

5662
protected LongToDoubleFunction centralityFunction = null;
63+
protected ScalarScaler.Variant scaler;
5764

5865
protected AbstractCentralityResultBuilder(
5966
ProcedureCallContext callContext,
@@ -63,6 +70,7 @@ protected AbstractCentralityResultBuilder(
6370
.outputFields()
6471
.anyMatch(s -> s.equalsIgnoreCase("centralityDistribution"));
6572
this.concurrency = concurrency;
73+
this.histogramError = new HashMap<>();
6674
}
6775

6876
protected abstract WRITE_RESULT buildResult();
@@ -72,17 +80,36 @@ public AbstractCentralityResultBuilder<WRITE_RESULT> withCentralityFunction(Long
7280
return this;
7381
}
7482

83+
public AbstractCentralityResultBuilder<WRITE_RESULT> withScalerVariant(ScalarScaler.Variant scaler) {
84+
this.scaler = scaler;
85+
return this;
86+
}
87+
7588
@Override
7689
public WRITE_RESULT build() {
7790
final ProgressTimer timer = ProgressTimer.start();
7891

92+
var logScaler = scaler == ScalarScaler.Variant.LOG;
7993
if (buildHistogram && centralityFunction != null) {
80-
maybeCentralityHistogram = Optional.of(CentralityStatistics.histogram(nodeCount, centralityFunction,Pools.DEFAULT, concurrency));
94+
if (logScaler) {
95+
logScalerHistogramError();
96+
} else {
97+
maybeCentralityHistogram = Optional.of(CentralityStatistics.histogram(
98+
nodeCount,
99+
centralityFunction,
100+
Pools.DEFAULT,
101+
concurrency
102+
));
103+
}
81104
}
82105
timer.stop();
83106
this.postProcessingMillis = timer.getDuration();
84107

85108
return buildResult();
86109
}
87110

111+
private void logScalerHistogramError() {
112+
this.histogramError.put(HISTOGRAM_ERROR_KEY, "Unable to create histogram when using scaler of type " + ScalarScaler.Variant.LOG);
113+
}
114+
88115
}

proc/centrality/src/main/java/org/neo4j/gds/pagerank/PageRankProc.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@
1919
*/
2020
package org.neo4j.gds.pagerank;
2121

22-
import org.neo4j.gds.result.AbstractCentralityResultBuilder;
2322
import org.neo4j.gds.AlgoBaseProc;
2423
import org.neo4j.gds.api.NodeProperties;
24+
import org.neo4j.gds.result.AbstractCentralityResultBuilder;
2525
import org.neo4j.internal.kernel.api.procs.ProcedureCallContext;
2626
import org.neo4j.logging.Log;
2727

@@ -47,7 +47,8 @@ static <PROC_RESULT, CONFIG extends PageRankConfig> PageRankResultBuilder<PROC_R
4747
procResultBuilder
4848
.withDidConverge(!computeResult.isGraphEmpty() && result.didConverge())
4949
.withRanIterations(!computeResult.isGraphEmpty() ? result.iterations() : 0)
50-
.withCentralityFunction(!computeResult.isGraphEmpty() ? computeResult.result().scores()::get : null);
50+
.withCentralityFunction(!computeResult.isGraphEmpty() ? computeResult.result().scores()::get : null)
51+
.withScalerVariant(computeResult.config().scaler());
5152

5253
return procResultBuilder;
5354
}

proc/centrality/src/test/java/org/neo4j/gds/pagerank/PageRankWriteProcTest.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,12 @@
2323
import org.junit.jupiter.api.TestFactory;
2424
import org.junit.jupiter.params.ParameterizedTest;
2525
import org.junit.jupiter.params.provider.MethodSource;
26+
import org.neo4j.gds.AlgoBaseProc;
27+
import org.neo4j.gds.GdsCypher.ModeBuildStage;
2628
import org.neo4j.gds.WritePropertyConfigProcTest;
2729
import org.neo4j.gds.compat.MapUtil;
2830
import org.neo4j.gds.core.CypherMapWrapper;
29-
import org.neo4j.gds.AlgoBaseProc;
30-
import org.neo4j.gds.GdsCypher.ModeBuildStage;
31+
import org.neo4j.gds.scaling.ScalarScaler;
3132

3233
import java.util.Collection;
3334
import java.util.List;
@@ -119,6 +120,23 @@ void testWriteYields(ModeBuildStage queryBuilder, String testCaseName) {
119120
)));
120121
}
121122

123+
@ParameterizedTest(name = "{1}")
124+
@MethodSource("org.neo4j.gds.pagerank.PageRankProcTest#graphVariations")
125+
void shouldNotComputeCentralityDistributionOnLogScaler(ModeBuildStage queryBuilder, String testCaseName) {
126+
var writeProp = "writeProp";
127+
var query = queryBuilder
128+
.writeMode()
129+
.addParameter("scaler", ScalarScaler.Variant.LOG)
130+
.addParameter("writeProperty", writeProp)
131+
.yields("centralityDistribution");
132+
133+
assertCypherResult(query, List.of(
134+
Map.of(
135+
"centralityDistribution", Map.of("Error", "Unable to create histogram when using scaler of type LOG")
136+
)
137+
));
138+
}
139+
122140
@Override
123141
public PageRankWriteConfig createConfig(CypherMapWrapper mapWrapper) {
124142
return PageRankWriteConfig.of(

0 commit comments

Comments
 (0)