Skip to content

Commit 1873fe3

Browse files
FlorentinDDarthMax
authored andcommitted
Reduce mappings in NodeFilteredGraph::streamRelationships
We know these always go from nodeId -> target
1 parent ef3b067 commit 1873fe3

File tree

2 files changed

+20
-6
lines changed

2 files changed

+20
-6
lines changed

core/src/main/java/org/neo4j/gds/core/huge/NodeFilteredGraph.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,10 +220,14 @@ public void forEachRelationship(long nodeId, double fallbackValue, RelationshipW
220220

221221
@Override
222222
public Stream<RelationshipCursor> streamRelationships(long nodeId, double fallbackValue) {
223+
if (! filteredIdMap.containsRootNodeId(filteredIdMap.toRootNodeId(nodeId))) {
224+
return Stream.empty();
225+
}
226+
223227
return super.streamRelationships(filteredIdMap.toRootNodeId(nodeId), fallbackValue)
224-
.filter(rel -> filteredIdMap.containsRootNodeId(rel.sourceId()) && filteredIdMap.containsRootNodeId(rel.targetId()))
228+
.filter(rel -> filteredIdMap.containsRootNodeId(rel.targetId()))
225229
.map(rel -> ((ModifiableRelationshipCursor) rel)
226-
.setSourceId(filteredIdMap.toFilteredNodeId(rel.sourceId()))
230+
.setSourceId(nodeId)
227231
.setTargetId(filteredIdMap.toFilteredNodeId(rel.targetId()))
228232
);
229233
}

core/src/test/java/org/neo4j/gds/core/huge/NodeFilteredGraphTest.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,10 @@
3131
import org.neo4j.gds.extension.IdFunction;
3232
import org.neo4j.gds.extension.Inject;
3333

34+
import java.util.List;
35+
import java.util.Map;
3436
import java.util.Optional;
3537
import java.util.function.Function;
36-
import java.util.stream.Stream;
3738

3839
import static org.assertj.core.api.Assertions.assertThat;
3940
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -129,9 +130,18 @@ void filterStreamRelationships() {
129130

130131
Function<String, Long> filteredIdFunction = (variable) -> graph.toMappedNodeId(idFunction.of(variable));
131132

132-
assertThat(graph.streamRelationships(filteredIdFunction.apply("a"), Double.NaN).mapToLong(RelationshipCursor::targetId)).containsExactlyInAnyOrder(Stream.of("b").map(filteredIdFunction).toArray(Long[]::new));
133-
assertThat(graph.streamRelationships(filteredIdFunction.apply("b"), Double.NaN).mapToLong(RelationshipCursor::targetId)).containsExactlyInAnyOrder(Stream.of("c", "d").map(filteredIdFunction).toArray(Long[]::new));
134-
assertThat(graph.streamRelationships(filteredIdFunction.apply("c"), Double.NaN).mapToLong(RelationshipCursor::targetId)).isEmpty();
133+
var expected = Map.<Long, List<String>>of(
134+
filteredIdFunction.apply("a"), List.of("b"),
135+
filteredIdFunction.apply("b"), List.of("c", "d"),
136+
filteredIdFunction.apply("c"), List.of()
137+
);
138+
139+
expected.forEach((source, targets) -> {
140+
assertThat(graph.streamRelationships(source, Double.NaN)
141+
.mapToLong(RelationshipCursor::targetId)).containsExactlyInAnyOrder(targets.stream()
142+
.map(filteredIdFunction)
143+
.toArray(Long[]::new));
144+
});
135145
}
136146

137147
@Test

0 commit comments

Comments
 (0)