forked from neo4j/graph-data-science
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAlphaCypherAggregation.java
More file actions
123 lines (111 loc) · 5.67 KB
/
Copy pathAlphaCypherAggregation.java
File metadata and controls
123 lines (111 loc) · 5.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
* Copyright (c) "Neo4j"
* Neo4j Sweden AB [http://neo4j.com]
*
* This file is part of Neo4j.
*
* Neo4j is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.neo4j.gds.projection;
import org.neo4j.gds.annotation.CustomProcedure;
import org.neo4j.gds.compat.DatabaseIdSupplier;
import org.neo4j.gds.compat.GraphDatabaseApiProxy;
import org.neo4j.gds.compat.UserFunctionSignatureBuilder;
import org.neo4j.gds.core.loading.Capabilities;
import org.neo4j.gds.core.loading.GraphStoreCatalogService;
import org.neo4j.gds.integration.Neo4jPoweredRequestCorrelationId;
import org.neo4j.gds.metrics.Metrics;
import org.neo4j.internal.kernel.api.exceptions.ProcedureException;
import org.neo4j.internal.kernel.api.procs.Neo4jTypes;
import org.neo4j.internal.kernel.api.procs.QualifiedName;
import org.neo4j.internal.kernel.api.procs.UserAggregationReducer;
import org.neo4j.internal.kernel.api.procs.UserFunctionSignature;
import org.neo4j.kernel.api.procedure.CallableUserAggregationFunction;
import org.neo4j.kernel.api.procedure.Context;
import org.neo4j.kernel.database.DatabaseReferenceImpl;
import org.neo4j.kernel.database.DatabaseReferenceRepository;
import org.neo4j.kernel.impl.api.TransactionRegistry;
import org.neo4j.procedure.Name;
import org.neo4j.values.AnyValue;
import org.neo4j.values.storable.TextValue;
import static org.neo4j.internal.kernel.api.procs.DefaultParameterValue.nullValue;
import static org.neo4j.internal.kernel.api.procs.FieldSignature.inputField;
public class AlphaCypherAggregation implements CallableUserAggregationFunction {
// NOTE: keep in sync with `procedureSyntax`
static final QualifiedName FUNCTION_NAME = new QualifiedName(
new String[]{"gds", "alpha", "graph"},
"project"
);
// NOTE: keep in sync with `procedureSyntax`
@Override
public UserFunctionSignature signature() {
return UserFunctionSignatureBuilder.builder()
.name(FUNCTION_NAME)
.addInputField(inputField("graphName", Neo4jTypes.NTString))
.addInputField(inputField("sourceNode", Neo4jTypes.NTAny))
.addInputField(inputField("targetNode", Neo4jTypes.NTAny, nullValue(Neo4jTypes.NTAny)))
.addInputField(inputField("nodesConfig", Neo4jTypes.NTAny, nullValue(Neo4jTypes.NTAny)))
.addInputField(inputField("relationshipConfig", Neo4jTypes.NTAny, nullValue(Neo4jTypes.NTAny)))
.addInputField(inputField("configuration", Neo4jTypes.NTAny, nullValue(Neo4jTypes.NTAny)))
.returnType(Neo4jTypes.NTMap)
.description("Creates a named graph in the catalog for use by algorithms.")
.internal(true)
.threadSafe(true)
.deprecatedBy("gds.graph.project")
.build().toNeo();
}
// NOTE: keep in sync with `FUNCTION_NAME` and `signature`
@CustomProcedure(value = "gds.alpha.graph.project", namespace = CustomProcedure.Namespace.AGGREGATION_FUNCTION)
public ProjectionResult procedureSyntax(
@Name("graphName") TextValue graphName,
@Name("sourceNode") AnyValue sourceNode,
@Name("targetNode") AnyValue targetNode,
@Name("nodesConfig") AnyValue nodesConfig,
@Name("relationshipConfig") AnyValue relationshipConfig,
@Name("configuration") AnyValue config
) {
throw new UnsupportedOperationException("This method is only used to document the procedure syntax.");
}
@Override
public UserAggregationReducer createReducer(Context ctx) throws ProcedureException {
var databaseService = ctx.graphDatabaseAPI();
var graphStoreCatalogService = GraphDatabaseApiProxy.lookupComponentProvider(ctx, GraphStoreCatalogService.class, true);
var metrics = GraphDatabaseApiProxy.lookupComponentProvider(ctx, Metrics.class, true);
var username = ctx.kernelTransaction().securityContext().subject().executingUser();
var transaction = ctx.transaction();
var ktxs = GraphDatabaseApiProxy.resolveDependency(databaseService, TransactionRegistry.class);
var queryProvider = ExecutingQueryProvider.fromTransaction(ktxs, transaction);
var databaseId = GraphDatabaseApiProxy.databaseId(databaseService);
var repo = GraphDatabaseApiProxy.resolveDependency(databaseService, DatabaseReferenceRepository.class);
var runsOnCompositeDatabase = repo.getCompositeDatabaseReferences()
.stream()
.map(DatabaseReferenceImpl.Internal::databaseId)
.anyMatch(databaseId::equals);
var writeMode = runsOnCompositeDatabase
? Capabilities.WriteMode.NONE
: Capabilities.WriteMode.LOCAL;
var transactionSequenceNumber = ctx.kernelTransaction().getTransactionSequenceNumber();
var requestCorrelationId = Neo4jPoweredRequestCorrelationId.create(transactionSequenceNumber);
return new AlphaGraphAggregator(
DatabaseIdSupplier.create().databaseId(ctx),
username,
writeMode,
queryProvider,
QueryEstimator.empty(),
graphStoreCatalogService,
metrics.projectionMetrics(),
requestCorrelationId
);
}
}