Skip to content

Commit c6cffbc

Browse files
soerenreichardts1ck
andcommitted
Use Nodes#nodeSchema in gdl factory
Co-authored-by: Martin Junghanns <martin.junghanns@neotechnology.com>
1 parent a2e273a commit c6cffbc

File tree

5 files changed

+70
-56
lines changed

5 files changed

+70
-56
lines changed

core/src/main/java/org/neo4j/gds/api/CSRGraphStoreFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ protected CSRGraphStore createGraphStore(
5050
.databaseId(DatabaseId.of(loadingContext.graphDatabaseService()))
5151
.capabilities(capabilities)
5252
.schema(computeGraphSchema(nodes, relationshipImportResult))
53-
.nodes(Nodes.of(nodes.idMap(), nodes.properties()))
53+
.nodes(nodes)
5454
.relationshipImportResult(relationshipImportResult)
5555
.concurrency(graphProjectConfig.readConcurrency())
5656
.build();

core/src/main/java/org/neo4j/gds/core/loading/CypherFactory.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ public CSRGraphStore build() {
140140
).load(ktx.internalTransaction());
141141

142142
progressTracker.beginSubTask("Loading");
143-
var idMapAndProperties = new CypherNodeLoader(
143+
var nodes = new CypherNodeLoader(
144144
nodeQuery(),
145145
nodeCount.rows(),
146146
cypherConfig,
@@ -150,14 +150,14 @@ public CSRGraphStore build() {
150150

151151
var relationshipsAndProperties = new CypherRelationshipLoader(
152152
relationshipQuery(),
153-
idMapAndProperties.idMap(),
153+
nodes.idMap(),
154154
cypherConfig,
155155
loadingContext,
156156
progressTracker
157157
).load(ktx.internalTransaction());
158158

159159
var graphStore = createGraphStore(
160-
idMapAndProperties,
160+
nodes,
161161
relationshipsAndProperties
162162
);
163163

core/src/main/java/org/neo4j/gds/core/loading/Nodes.java

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -58,23 +58,6 @@ static Nodes of(IdMap idmap, NodePropertyStore nodePropertyStore) {
5858
return ImmutableNodes.of(NodeSchema.empty(), idmap, nodePropertyStore);
5959
}
6060

61-
static Nodes of(IdMap idMap, NodeSchema nodeSchema, Map<String, NodePropertyValues> properties, PropertyState propertyState) {
62-
var nodePropertyStoreBuilder = NodePropertyStore.builder();
63-
64-
nodeSchema.availableLabels().forEach(nodeLabel -> {
65-
var propertiesForLabel = nodeSchema.get(nodeLabel).properties();
66-
propertiesForLabel.forEach((propertyKey, propertySchema) -> nodePropertyStoreBuilder.putProperty(propertyKey,
67-
ImmutableNodeProperty
68-
.builder()
69-
.propertySchema(propertySchema)
70-
.values(properties.get(propertyKey))
71-
.build()
72-
));
73-
});
74-
75-
return ImmutableNodes.of(nodeSchema, idMap, nodePropertyStoreBuilder.build());
76-
}
77-
7861
static Nodes of(
7962
IdMap idMap,
8063
Map<NodeLabel, PropertyMappings> propertyMappingsByLabel,
@@ -120,4 +103,20 @@ static Nodes of(IdMap idMap, Map<PropertyMapping, NodePropertyValues> properties
120103
));
121104
return ImmutableNodes.of(NodeSchema.empty(), idMap, builder.build());
122105
}
106+
107+
static Nodes of(NodeSchema nodeSchema, IdMap idMap, Map<PropertyMapping, NodePropertyValues> properties, PropertyState propertyState) {
108+
NodePropertyStore.Builder builder = NodePropertyStore.builder();
109+
properties.forEach((mapping, nodeProperties) -> builder.putProperty(
110+
mapping.propertyKey(),
111+
NodeProperty.of(
112+
mapping.propertyKey(),
113+
propertyState,
114+
nodeProperties,
115+
mapping.defaultValue().isUserDefined()
116+
? mapping.defaultValue()
117+
: nodeProperties.valueType().fallbackValue()
118+
)
119+
));
120+
return ImmutableNodes.of(nodeSchema, idMap, builder.build());
121+
}
123122
}

core/src/main/java/org/neo4j/gds/core/loading/construction/NodeLabelTokenToPropertyKeys.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,11 @@ Map<String, PropertySchema> propertySchemas(
158158
return false;
159159
})
160160
.flatMap(nodeLabelToken -> this.labelToPropertyKeys.get(nodeLabelToken).stream())
161-
.collect(Collectors.toMap(propertyKey -> propertyKey, importPropertySchemas::get));
161+
.collect(Collectors.toMap(
162+
propertyKey -> propertyKey,
163+
importPropertySchemas::get,
164+
(lhs, rhs) -> lhs
165+
));
162166
}
163167
}
164168
}

test-utils/src/main/java/org/neo4j/gds/gdl/GdlFactory.java

Lines changed: 45 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,6 @@
3434
import org.neo4j.gds.api.properties.nodes.NodePropertyValues;
3535
import org.neo4j.gds.api.schema.Direction;
3636
import org.neo4j.gds.api.schema.GraphSchema;
37-
import org.neo4j.gds.api.schema.NodeSchema;
38-
import org.neo4j.gds.api.schema.PropertySchema;
3937
import org.neo4j.gds.api.schema.RelationshipSchema;
4038
import org.neo4j.gds.core.GraphDimensions;
4139
import org.neo4j.gds.core.ImmutableGraphDimensions;
@@ -49,12 +47,14 @@
4947
import org.neo4j.gds.core.loading.construction.GraphFactory;
5048
import org.neo4j.gds.core.loading.construction.ImmutablePropertyConfig;
5149
import org.neo4j.gds.core.loading.construction.NodeLabelTokens;
50+
import org.neo4j.gds.core.loading.construction.PropertyValues;
5251
import org.neo4j.gds.core.loading.construction.RelationshipsBuilder;
5352
import org.neo4j.gds.core.loading.nodeproperties.NodePropertiesFromStoreBuilder;
5453
import org.neo4j.gds.core.utils.mem.MemoryEstimation;
5554
import org.neo4j.gds.core.utils.mem.MemoryEstimations;
5655
import org.neo4j.gds.core.utils.progress.tasks.ProgressTracker;
5756
import org.neo4j.gds.extension.GdlSupportPerMethodExtension;
57+
import org.neo4j.values.storable.Value;
5858
import org.neo4j.values.storable.Values;
5959
import org.s1ck.gdl.GDLHandler;
6060
import org.s1ck.gdl.model.Element;
@@ -165,33 +165,33 @@ protected ProgressTracker initProgressTracker() {
165165

166166
@Override
167167
protected GraphSchema computeGraphSchema(Nodes nodes, RelationshipImportResult relationshipImportResult) {
168-
var nodeProperties = nodes.properties();
169-
var nodeSchema = NodeSchema.empty();
170-
gdlHandler
171-
.getVertices()
172-
.forEach(vertex -> {
173-
var labels = vertex.getLabels().stream().map(NodeLabel::of).collect(Collectors.toList());
174-
if (labels.isEmpty()) {
175-
labels = List.of(NodeLabel.ALL_NODES);
176-
}
177-
178-
labels.forEach(label -> vertex
179-
.getProperties()
180-
.forEach((propertyKey, propertyValue) -> nodeSchema
181-
.getOrCreateLabel(label)
182-
.addProperty(
183-
propertyKey,
184-
PropertySchema.of(
185-
propertyKey,
186-
nodeProperties.get(propertyKey).valueType(),
187-
nodeProperties.get(propertyKey).defaultValue(),
188-
nodeProperties.get(propertyKey).propertyState()
189-
)
190-
)
191-
));
192-
});
193-
// in case there were no properties add all labels
194-
nodes.idMap().availableNodeLabels().forEach(nodeSchema::getOrCreateLabel);
168+
// var nodeProperties = nodes.properties();
169+
// var nodeSchema = NodeSchema.empty();
170+
// gdlHandler
171+
// .getVertices()
172+
// .forEach(vertex -> {
173+
// var labels = vertex.getLabels().stream().map(NodeLabel::of).collect(Collectors.toList());
174+
// if (labels.isEmpty()) {
175+
// labels = List.of(NodeLabel.ALL_NODES);
176+
// }
177+
//
178+
// labels.forEach(label -> vertex
179+
// .getProperties()
180+
// .forEach((propertyKey, propertyValue) -> nodeSchema
181+
// .getOrCreateLabel(label)
182+
// .addProperty(
183+
// propertyKey,
184+
// PropertySchema.of(
185+
// propertyKey,
186+
// nodeProperties.get(propertyKey).valueType(),
187+
// nodeProperties.get(propertyKey).defaultValue(),
188+
// nodeProperties.get(propertyKey).propertyState()
189+
// )
190+
// )
191+
// ));
192+
// });
193+
// // in case there were no properties add all labels
194+
// nodes.idMap().availableNodeLabels().forEach(nodeSchema::getOrCreateLabel);
195195

196196
var relationshipSchema = relationshipImportResult.importResults().entrySet().stream().reduce(
197197
RelationshipSchema.empty(),
@@ -204,7 +204,7 @@ protected GraphSchema computeGraphSchema(Nodes nodes, RelationshipImportResult r
204204
);
205205

206206
return GraphSchema.of(
207-
nodeSchema,
207+
nodes.schema(),
208208
relationshipSchema,
209209
Map.of()
210210
);
@@ -230,7 +230,9 @@ private Nodes loadNodes() {
230230
var nodesBuilder = GraphFactory.initNodesBuilder()
231231
.maxOriginalId(dimensions.highestPossibleNodeCount() - 1)
232232
.hasLabelInformation(true)
233+
.hasProperties(true)
233234
.concurrency(1)
235+
.propertyState(graphProjectConfig.propertyState())
234236
.build();
235237

236238
gdlHandler.getVertices().forEach(vertex -> {
@@ -241,15 +243,24 @@ private Nodes loadNodes() {
241243
.filter(label -> !NodeLabel.ALL_NODES.name().equals(label))
242244
.collect(Collectors.toList());
243245
}
246+
247+
Map<String, Value> propertyValues = new HashMap<>();
248+
vertex.getProperties().forEach((propertyKey, propertyValue) -> {
249+
if (propertyValue instanceof List) {
250+
propertyValue = convertListProperty((List<?>) propertyValue);
251+
}
252+
propertyValues.put(propertyKey, Values.of(propertyValue));
253+
});
254+
244255
nodesBuilder.addNode(
245256
vertex.getId(),
246-
NodeLabelTokens.of(labels)
257+
NodeLabelTokens.of(labels),
258+
PropertyValues.of(propertyValues)
247259
);
248260
});
249261

250-
var idMap = nodesBuilder.build().idMap();
251-
252-
return Nodes.of(idMap, loadNodeProperties(idMap), graphProjectConfig.propertyState());
262+
var nodes = nodesBuilder.build();
263+
return Nodes.of(nodes.schema(), nodes.idMap(), loadNodeProperties(nodes.idMap()), graphProjectConfig.propertyState());
253264
}
254265

255266
private Map<PropertyMapping, NodePropertyValues> loadNodeProperties(IdMap idMap) {

0 commit comments

Comments
 (0)