Skip to content

Commit 24fa0ee

Browse files
authored
Merge pull request #916 from DarthMax/1.1-consistently-use-relationshiptype
1.1 - Consistently Use RelationshipType instead of String
2 parents e114465 + 4f8866a commit 24fa0ee

File tree

29 files changed

+259
-210
lines changed

29 files changed

+259
-210
lines changed

alpha/alpha-algo/src/main/java/org/neo4j/graphalgo/impl/similarity/ApproxNearestNeighborsAlgorithm.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.carrotsearch.hppc.LongHashSet;
2323
import com.carrotsearch.hppc.cursors.LongCursor;
2424
import org.neo4j.graphalgo.Orientation;
25+
import org.neo4j.graphalgo.RelationshipType;
2526
import org.neo4j.graphalgo.annotation.ValueClass;
2627
import org.neo4j.graphalgo.api.Graph;
2728
import org.neo4j.graphalgo.api.RelationshipIterator;
@@ -60,8 +61,8 @@
6061

6162
public final class ApproxNearestNeighborsAlgorithm<INPUT extends SimilarityInput> extends SimilarityAlgorithm<ApproxNearestNeighborsAlgorithm<INPUT>, INPUT> {
6263

63-
private static final String ANN_OUT_GRAPH = "ANN_OUT";
64-
private static final String ANN_IN_GRAPH = "ANN_IN";
64+
private static final RelationshipType ANN_OUT_GRAPH = RelationshipType.of("ANN_OUT");
65+
private static final RelationshipType ANN_IN_GRAPH = RelationshipType.of("ANN_IN");
6566

6667
private final ApproximateNearestNeighborsConfig config;
6768
private final SimilarityAlgorithm<?, INPUT> algorithm;
@@ -558,7 +559,7 @@ default GraphStore buildGraphStore(IdMap idMap, AllocationTracker tracker) {
558559
HugeGraph.Relationships outRelationships = outImporter().build();
559560
HugeGraph.Relationships inRelationships = inImporter().build();
560561

561-
Map<String, HugeGraph.TopologyCSR> topology = new HashMap<>();
562+
Map<RelationshipType, HugeGraph.TopologyCSR> topology = new HashMap<>();
562563
topology.put(ANN_OUT_GRAPH, outRelationships.topology());
563564
topology.put(ANN_IN_GRAPH, inRelationships.topology());
564565

alpha/alpha-algo/src/test/java/org/neo4j/graphalgo/impl/shortestpaths/DirectedDijkstraSPTest.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.neo4j.graphalgo.Orientation;
2828
import org.neo4j.graphalgo.PropertyMapping;
2929
import org.neo4j.graphalgo.RelationshipProjection;
30+
import org.neo4j.graphalgo.RelationshipType;
3031
import org.neo4j.graphalgo.StoreLoaderBuilder;
3132
import org.neo4j.graphalgo.TestDatabaseCreator;
3233
import org.neo4j.graphalgo.api.Graph;
@@ -113,7 +114,7 @@ private String name(long id) {
113114
void testOutgoing() {
114115
StringBuilder path = new StringBuilder();
115116
DijkstraConfig config = DijkstraConfig.of(id("a"), id("f"));
116-
Graph graph = graphStore.getGraph("REL_OUT", Optional.of("cost"));
117+
Graph graph = graphStore.getGraph(RelationshipType.of("REL_OUT"), Optional.of("cost"));
117118
ShortestPathDijkstra dijkstra = new ShortestPathDijkstra(graph, config);
118119
dijkstra.compute();
119120

@@ -127,7 +128,7 @@ void testOutgoing() {
127128
void testIncoming() {
128129
StringBuilder path = new StringBuilder();
129130
DijkstraConfig config = DijkstraConfig.of(id("a"), id("f"));
130-
Graph graph = graphStore.getGraph("REL_IN", Optional.of("cost"));
131+
Graph graph = graphStore.getGraph(RelationshipType.of("REL_IN"), Optional.of("cost"));
131132
ShortestPathDijkstra dijkstra = new ShortestPathDijkstra(graph, config);
132133
dijkstra.compute();
133134

@@ -141,7 +142,7 @@ void testIncoming() {
141142
void testBoth() {
142143
StringBuilder path = new StringBuilder();
143144
DijkstraConfig config = DijkstraConfig.of(id("a"), id("f"));
144-
Graph graph = graphStore.getGraph("REL_BOTH", Optional.of("cost"));
145+
Graph graph = graphStore.getGraph(RelationshipType.of("REL_BOTH"), Optional.of("cost"));
145146
ShortestPathDijkstra dijkstra = new ShortestPathDijkstra(graph, config);
146147
dijkstra.compute(id("a"), id("f"));
147148

@@ -155,7 +156,7 @@ void testBoth() {
155156
void testUnreachableOutgoing() {
156157
StringBuilder path = new StringBuilder();
157158
DijkstraConfig config = DijkstraConfig.of(id("a"), id("x"));
158-
Graph graph = graphStore.getGraph("REL_OUT", Optional.of("cost"));
159+
Graph graph = graphStore.getGraph(RelationshipType.of("REL_OUT"), Optional.of("cost"));
159160
ShortestPathDijkstra dijkstra = new ShortestPathDijkstra(graph, config);
160161
dijkstra.compute();
161162

@@ -169,7 +170,7 @@ void testUnreachableOutgoing() {
169170
void testUnreachableIncoming() {
170171
StringBuilder path = new StringBuilder();
171172
DijkstraConfig config = DijkstraConfig.of(id("a"), id("x"));
172-
Graph graph = graphStore.getGraph("REL_IN", Optional.of("cost"));
173+
Graph graph = graphStore.getGraph(RelationshipType.of("REL_IN"), Optional.of("cost"));
173174
ShortestPathDijkstra dijkstra = new ShortestPathDijkstra(graph, config);
174175
dijkstra.compute();
175176

@@ -183,7 +184,7 @@ void testUnreachableIncoming() {
183184
void testUnreachableBoth() {
184185
StringBuilder path = new StringBuilder();
185186
DijkstraConfig config = DijkstraConfig.of(id("a"), id("x"));
186-
Graph graph = graphStore.getGraph("REL_BOTH", Optional.of("cost"));
187+
Graph graph = graphStore.getGraph(RelationshipType.of("REL_BOTH"), Optional.of("cost"));
187188
ShortestPathDijkstra dijkstra = new ShortestPathDijkstra(graph, config);
188189
dijkstra.compute();
189190

alpha/alpha-algo/src/test/java/org/neo4j/graphalgo/impl/traverse/TraverseTest.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.neo4j.graphalgo.Orientation;
2727
import org.neo4j.graphalgo.PropertyMapping;
2828
import org.neo4j.graphalgo.RelationshipProjection;
29+
import org.neo4j.graphalgo.RelationshipType;
2930
import org.neo4j.graphalgo.StoreLoaderBuilder;
3031
import org.neo4j.graphalgo.TestDatabaseCreator;
3132
import org.neo4j.graphalgo.api.Graph;
@@ -117,7 +118,7 @@ private String name(long id) {
117118
void testBfsToTargetOut() {
118119
long source = id("a");
119120
long target = id("d");
120-
Graph graph = graphs.getGraph("REL_OUT", Optional.of("cost"));
121+
Graph graph = graphs.getGraph(RelationshipType.of("REL_OUT"), Optional.of("cost"));
121122
long[] nodes = Traverse.bfs(
122123
graph,
123124
source,
@@ -136,7 +137,7 @@ void testBfsToTargetOut() {
136137
void testDfsToTargetOut() {
137138
long source = id("a");
138139
long target = id("g");
139-
Graph graph = graphs.getGraph("REL_OUT", Optional.of("cost"));
140+
Graph graph = graphs.getGraph(RelationshipType.of("REL_OUT"), Optional.of("cost"));
140141
long[] nodes = Traverse.dfs(
141142
graph,
142143
source,
@@ -154,7 +155,7 @@ void testDfsToTargetOut() {
154155
@Test
155156
void testExitConditionNeverTerminates() {
156157
long source = id("a");
157-
Graph graph = graphs.getGraph("REL_OUT", Optional.of("cost"));
158+
Graph graph = graphs.getGraph(RelationshipType.of("REL_OUT"), Optional.of("cost"));
158159
long[] nodes = Traverse.dfs(
159160
graph,
160161
source,
@@ -172,7 +173,7 @@ void testExitConditionNeverTerminates() {
172173
void testDfsToTargetIn() {
173174
long source = id("g");
174175
long target = id("a");
175-
Graph graph = graphs.getGraph("REL_IN", Optional.of("cost"));
176+
Graph graph = graphs.getGraph(RelationshipType.of("REL_IN"), Optional.of("cost"));
176177
long[] nodes = Traverse.dfs(
177178
graph,
178179
source,
@@ -191,7 +192,7 @@ void testDfsToTargetIn() {
191192
void testBfsToTargetIn() {
192193
long source = id("g");
193194
long target = id("a");
194-
Graph graph = graphs.getGraph("REL_IN", Optional.of("cost"));
195+
Graph graph = graphs.getGraph(RelationshipType.of("REL_IN"), Optional.of("cost"));
195196
long[] nodes = Traverse.bfs(
196197
graph,
197198
source,
@@ -211,7 +212,7 @@ void testBfsToTargetIn() {
211212
void testBfsMaxDepthOut() {
212213
long source = id("a");
213214
double maxHops = 3.;
214-
Graph graph = graphs.getGraph("REL_OUT", Optional.of("cost"));
215+
Graph graph = graphs.getGraph(RelationshipType.of("REL_OUT"), Optional.of("cost"));
215216
long[] nodes = Traverse.bfs(
216217
graph,
217218
source,
@@ -225,7 +226,7 @@ void testBfsMaxDepthOut() {
225226
void testBfsMaxCostOut() {
226227
long source = id("a");
227228
double maxCost = 3.;
228-
Graph graph = graphs.getGraph("REL_OUT", Optional.of("cost"));
229+
Graph graph = graphs.getGraph(RelationshipType.of("REL_OUT"), Optional.of("cost"));
229230
long[] nodes = Traverse.bfs(
230231
graph,
231232
source,
@@ -242,7 +243,7 @@ void testBfsMaxCostOut() {
242243
void testDfsMaxCostOut() {
243244
long source = id("a");
244245
double maxCost = 3.;
245-
Graph graph = graphs.getGraph("REL_OUT", Optional.of("cost"));
246+
Graph graph = graphs.getGraph(RelationshipType.of("REL_OUT"), Optional.of("cost"));
246247
long[] nodes = Traverse.dfs(
247248
graph,
248249
source,

compatibility/3.5/neo4j-export-adapter/src/main/java/org/neo4j/graphalgo/core/utils/export/GraphStoreInput.java

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

2222
import org.eclipse.collections.api.tuple.Pair;
2323
import org.eclipse.collections.impl.tuple.Tuples;
24+
import org.neo4j.graphalgo.RelationshipType;
2425
import org.neo4j.graphalgo.api.Graph;
25-
import org.neo4j.graphalgo.api.IdMapGraph;
2626
import org.neo4j.graphalgo.api.NodeProperties;
2727
import org.neo4j.graphalgo.api.RelationshipIterator;
2828
import org.neo4j.graphalgo.core.loading.GraphStore;
@@ -139,7 +139,7 @@ public InputChunk newChunk() {
139139
}
140140

141141
static class RelationshipImporter extends GraphImporter {
142-
private final Map<Pair<String, Optional<String>>, Graph> relationships;
142+
private final Map<Pair<RelationshipType, Optional<String>>, Graph> relationships;
143143

144144
RelationshipImporter(GraphStore graphStore, long nodeCount, int batchSize) {
145145
super(nodeCount, batchSize);
@@ -207,24 +207,24 @@ public boolean next(InputEntityVisitor visitor) throws IOException {
207207

208208
static class RelationshipChunk extends EntityChunk {
209209

210-
private final Map<Pair<String, Optional<String>>, Graph> relationships;
210+
private final Map<Pair<RelationshipType, Optional<String>>, Graph> relationships;
211211

212-
RelationshipChunk(Map<Pair<String, Optional<String>>, Graph> relationships) {
212+
RelationshipChunk(Map<Pair<RelationshipType, Optional<String>>, Graph> relationships) {
213213
this.relationships = relationships;
214214
}
215215

216216
@Override
217217
public boolean next(InputEntityVisitor visitor) {
218218
if (id < endId) {
219-
for (Map.Entry<Pair<String, Optional<String>>, Graph> relationship : relationships.entrySet()) {
220-
String relType = relationship.getKey().getOne();
219+
for (Map.Entry<Pair<RelationshipType, Optional<String>>, Graph> relationship : relationships.entrySet()) {
220+
RelationshipType relType = relationship.getKey().getOne();
221221
Optional<String> relProperty = relationship.getKey().getTwo();
222222
RelationshipIterator iterator = relationship.getValue();
223223

224224
iterator.forEachRelationship(id, Double.NaN, (s, t, propertyValue) -> {
225225
visitor.startId(s);
226226
visitor.endId(t);
227-
visitor.type(relType);
227+
visitor.type(relType.name);
228228
relProperty.ifPresent(value -> visitor.property(value, propertyValue));
229229
try {
230230
visitor.endOfEntity();

compatibility/4.0/neo4j-export-adapter/src/main/java/org/neo4j/graphalgo/core/utils/export/GraphStoreInput.java

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

2222
import org.eclipse.collections.api.tuple.Pair;
2323
import org.eclipse.collections.impl.tuple.Tuples;
24+
import org.neo4j.graphalgo.RelationshipType;
2425
import org.neo4j.graphalgo.api.Graph;
2526
import org.neo4j.graphalgo.api.NodeProperties;
2627
import org.neo4j.graphalgo.api.RelationshipIterator;
@@ -138,7 +139,7 @@ public InputChunk newChunk() {
138139
}
139140

140141
static class RelationshipImporter extends GraphImporter {
141-
private final Map<Pair<String, Optional<String>>, Graph> relationships;
142+
private final Map<Pair<RelationshipType, Optional<String>>, Graph> relationships;
142143

143144
RelationshipImporter(GraphStore graphStore, long nodeCount, int batchSize) {
144145
super(nodeCount, batchSize);
@@ -206,24 +207,24 @@ public boolean next(InputEntityVisitor visitor) throws IOException {
206207

207208
static class RelationshipChunk extends EntityChunk {
208209

209-
private final Map<Pair<String, Optional<String>>, Graph> relationships;
210+
private final Map<Pair<RelationshipType, Optional<String>>, Graph> relationships;
210211

211-
RelationshipChunk(Map<Pair<String, Optional<String>>, Graph> relationships) {
212+
RelationshipChunk(Map<Pair<RelationshipType, Optional<String>>, Graph> relationships) {
212213
this.relationships = relationships;
213214
}
214215

215216
@Override
216217
public boolean next(InputEntityVisitor visitor) {
217218
if (id < endId) {
218-
for (Map.Entry<Pair<String, Optional<String>>, Graph> relationship : relationships.entrySet()) {
219-
String relType = relationship.getKey().getOne();
219+
for (Map.Entry<Pair<RelationshipType, Optional<String>>, Graph> relationship : relationships.entrySet()) {
220+
RelationshipType relType = relationship.getKey().getOne();
220221
Optional<String> relProperty = relationship.getKey().getTwo();
221222
RelationshipIterator iterator = relationship.getValue();
222223

223224
iterator.forEachRelationship(id, Double.NaN, (s, t, propertyValue) -> {
224225
visitor.startId(s);
225226
visitor.endId(t);
226-
visitor.type(relType);
227+
visitor.type(relType.name);
227228
relProperty.ifPresent(value -> visitor.property(value, propertyValue));
228229
try {
229230
visitor.endOfEntity();

core/src/main/java/org/neo4j/graphalgo/ElementIdentifier.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,10 @@ public abstract class ElementIdentifier {
2929
public final @NotNull String name;
3030

3131
public ElementIdentifier(@NotNull String name) {
32-
if (StringUtils.isEmpty(name)) {
33-
throw new IllegalArgumentException("name cannot be empty");
34-
}
32+
// TODO: We need to disable this until we have found a solution for handling * vs empty String
33+
// if (StringUtils.isEmpty(name)) {
34+
// throw new IllegalArgumentException("name cannot be empty");
35+
// }
3536
this.name = name;
3637
}
3738

core/src/main/java/org/neo4j/graphalgo/RelationshipProjectionMapping.java

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

2222
import org.neo4j.graphalgo.annotation.ValueClass;
2323

24+
import static org.neo4j.graphalgo.RelationshipType.ALL_RELATIONSHIPS;
2425
import static org.neo4j.graphalgo.compat.StatementConstantsProxy.ANY_RELATIONSHIP_TYPE;
2526
import static org.neo4j.graphalgo.compat.StatementConstantsProxy.NO_SUCH_RELATIONSHIP_TYPE;
2627

@@ -34,14 +35,14 @@ static RelationshipProjectionMapping all() {
3435
static RelationshipProjectionMapping all(Orientation orientation) {
3536
return ImmutableRelationshipProjectionMapping.builder()
3637
.typeName("")
37-
.elementIdentifier("")
38+
.relationshipType(RelationshipType.of(""))
3839
.orientation(orientation)
3940
.typeId(ANY_RELATIONSHIP_TYPE)
4041
.exists(true)
4142
.build();
4243
}
4344

44-
String elementIdentifier();
45+
RelationshipType relationshipType();
4546

4647
String typeName();
4748

@@ -52,17 +53,17 @@ static RelationshipProjectionMapping all(Orientation orientation) {
5253
boolean exists();
5354

5455
static RelationshipProjectionMapping of(String typeName, int typeId) {
55-
return of(typeName, typeName, Orientation.NATURAL, typeId);
56+
return of(RelationshipType.of(typeName), typeName, Orientation.NATURAL, typeId);
5657
}
5758

5859
static RelationshipProjectionMapping of(
59-
String elementIdentifier,
60+
RelationshipType relationshipType,
6061
String typeName,
6162
Orientation orientation,
6263
int typeId
6364
) {
6465
return ImmutableRelationshipProjectionMapping.builder()
65-
.elementIdentifier(elementIdentifier)
66+
.relationshipType(relationshipType)
6667
.typeName(typeName)
6768
.orientation(orientation)
6869
.typeId(typeId)

core/src/main/java/org/neo4j/graphalgo/api/GraphStoreFactory.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.carrotsearch.hppc.ObjectLongMap;
2323
import org.neo4j.graphalgo.Orientation;
2424
import org.neo4j.graphalgo.RelationshipProjectionMapping;
25+
import org.neo4j.graphalgo.RelationshipType;
2526
import org.neo4j.graphalgo.annotation.ValueClass;
2627
import org.neo4j.graphalgo.config.GraphCreateConfig;
2728
import org.neo4j.graphalgo.core.GraphDimensions;
@@ -87,7 +88,7 @@ public GraphDimensions dimensions() {
8788
protected ProgressLogger initProgressLogger() {
8889
long relationshipCount = dimensions.relationshipProjectionMappings().stream()
8990
.mapToLong(mapping -> {
90-
Long typeCount = dimensions.relationshipCounts().get(mapping.elementIdentifier());
91+
Long typeCount = dimensions.relationshipCounts().get(mapping.relationshipType());
9192
return mapping.orientation() == Orientation.UNDIRECTED
9293
? typeCount * 2
9394
: typeCount;
@@ -108,16 +109,16 @@ protected GraphStore createGraphStore(
108109
GraphDimensions dimensions
109110
) {
110111
int relTypeCount = dimensions.relationshipProjectionMappings().numberOfMappings();
111-
Map<String, HugeGraph.TopologyCSR> relationships = new HashMap<>(relTypeCount);
112-
Map<String, Map<String, HugeGraph.PropertyCSR>> relationshipProperties = new HashMap<>(relTypeCount);
112+
Map<RelationshipType, HugeGraph.TopologyCSR> relationships = new HashMap<>(relTypeCount);
113+
Map<RelationshipType, Map<String, HugeGraph.PropertyCSR>> relationshipProperties = new HashMap<>(relTypeCount);
113114

114115
relationshipImportResult.builders().forEach((relationshipProjectionMapping, relationshipsBuilder) -> {
115116
AdjacencyList adjacencyList = relationshipsBuilder.adjacencyList();
116117
AdjacencyOffsets adjacencyOffsets = relationshipsBuilder.globalAdjacencyOffsets();
117118
long relationshipCount = relationshipImportResult.counts().getOrDefault(relationshipProjectionMapping, 0L);
118119

119120
relationships.put(
120-
relationshipProjectionMapping.elementIdentifier(),
121+
relationshipProjectionMapping.relationshipType(),
121122
ImmutableTopologyCSR.of(
122123
adjacencyList,
123124
adjacencyOffsets,
@@ -140,7 +141,7 @@ protected GraphStore createGraphStore(
140141
propertyIdAndMapping.getTwo().defaultValue()
141142
)
142143
));
143-
relationshipProperties.put(relationshipProjectionMapping.elementIdentifier(), propertyMap);
144+
relationshipProperties.put(relationshipProjectionMapping.relationshipType(), propertyMap);
144145
}
145146
});
146147

0 commit comments

Comments
 (0)