Skip to content

Commit 90d5e09

Browse files
committed
add bidirectional path finder
1 parent 5179957 commit 90d5e09

File tree

7 files changed

+43
-676
lines changed

7 files changed

+43
-676
lines changed

src/main/java/com/bytecodedl/pathfinder/FindAnyOneEvaluator.java

Lines changed: 0 additions & 64 deletions
This file was deleted.

src/main/java/com/bytecodedl/pathfinder/FindAnyOneExpander.java

Lines changed: 0 additions & 37 deletions
This file was deleted.

src/main/java/com/bytecodedl/pathfinder/FindAnyOnePath.java

Lines changed: 36 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,7 @@
55
import org.neo4j.graphalgo.WeightedPath;
66
import org.neo4j.graphalgo.impl.util.PathImpl;
77
import org.neo4j.graphdb.*;
8-
import org.neo4j.graphdb.traversal.Evaluators;
9-
import org.neo4j.graphdb.traversal.InitialBranchState;
10-
import org.neo4j.graphdb.traversal.Traverser;
11-
import org.neo4j.graphdb.traversal.Uniqueness;
8+
import org.neo4j.graphdb.traversal.*;
129
import org.neo4j.logging.Log;
1310
import org.neo4j.procedure.*;
1411

@@ -33,14 +30,12 @@ public class FindAnyOnePath {
3330

3431

3532
@Procedure(name = "bytecodedl.findOnePath", mode = Mode.READ)
36-
@Description("find one path from start to end between minlength and maxlength, also show first multi dispatch")
37-
public Stream<PathRecord> findOnePath(@Name("start") Node start, @Name("end") Node end, @Name("maxLength") String maxLength, @Name("minLength") String minLength, @Name("callProperty") String callProperty){
33+
@Description("find one path from start to end under maxlength, also show first multi dispatch")
34+
public Stream<PathRecord> findOnePath(@Name("start") Node start, @Name("end") Node end, @Name("maxLength") long maxLength, @Name("callProperty") String callProperty){
3835
final Traverser traverse = tx.traversalDescription()
39-
//.depthFirst()
4036
.breadthFirst()
41-
.evaluator(new FindAnyOneEvaluator(end, maxLength, minLength, log))
42-
.expand(new FindAnyOneExpander(PathExpanders.forTypeAndDirection(RelationshipType.withName("Call"), Direction.OUTGOING ), log), new InitialBranchState.State<Boolean>(false, false))
43-
//.expand(PathExpanders.forTypeAndDirection( RelationshipType.withName("Call"), Direction.OUTGOING ))
37+
.evaluator(Evaluators.toDepth((int)maxLength))
38+
.expand(PathExpanders.forTypeAndDirection(RelationshipType.withName("Call"), Direction.OUTGOING ))
4439
.uniqueness(Uniqueness.NODE_GLOBAL)
4540
.traverse(start);
4641

@@ -59,44 +54,37 @@ public Stream<PathRecord> findOnePath(@Name("start") Node start, @Name("end") No
5954
}
6055
}
6156

62-
// @Procedure(name = "bytecodedl.dijkstra", mode = Mode.READ)
63-
// @Description("find one path from start to end between minlength and maxlength, also show first multi dispatch")
64-
// public Stream<PathRecord> dijkstra(
65-
// @Name("startNode") Node startNode,
66-
// @Name("endNode") Node endNode,
67-
// @Name("weightPropertyName") String weightPropertyName,
68-
// @Name(value = "defaultWeight", defaultValue = "NaN") double defaultWeight,
69-
// @Name(value = "numberOfWantedPaths", defaultValue = "1") long numberOfWantedPaths
70-
// ){
71-
// PathFinder<WeightedPath> algo = GraphAlgoFactory.dijkstra(
72-
// buildPathExpander(),
73-
// (relationship, direction) -> Util.toDouble(relationship.getProperty(weightPropertyName, defaultWeight)),
74-
// (int)numberOfWantedPaths
75-
// );
76-
// Iterable<WeightedPath> paths = algo.findAllPaths(startNode, endNode);
77-
//
78-
// Optional<WeightedPath> optionalPath = StreamSupport
79-
// .stream(paths.spliterator(), false).findFirst();
80-
//
81-
// if (optionalPath.isPresent()){
82-
// Path path = optionalPath.get();
83-
// List<Relationship> multiDispatchRelationship = getFirstMultiDispatch(path, "insn");
84-
// List<Path> pathList = multiDispatchRelationship.stream().map(this::relationShipToPath).collect(Collectors.toList());
85-
// pathList.add(path);
86-
// return pathList.stream().map(PathRecord::new);
87-
// }else {
88-
// return StreamSupport
89-
// .stream(paths.spliterator(), false).map(PathRecord::new);
90-
// }
91-
// }
92-
93-
public PathExpander<Double> buildPathExpander() {
94-
// PathExpanderBuilder builder = PathExpanderBuilder.allTypesAndDirections();
95-
96-
PathExpanderBuilder builder = PathExpanderBuilder.empty();
97-
builder = builder.add(RelationshipType.withName("Call"), Direction.OUTGOING);
98-
PathExpander<Double> expander = builder.build();
99-
return expander;
57+
@Procedure(name = "bytecodedl.biFindOnePath", mode = Mode.READ)
58+
@Description("find one path from start to end between minlength and maxlength, also show first multi dispatch")
59+
public Stream<PathRecord> biFindOnePath(@Name("start") Node start, @Name("end") Node end, @Name("maxLength") long maxLength, @Name("callProperty") String callProperty){
60+
TraversalDescription base = tx.traversalDescription().depthFirst().uniqueness(Uniqueness.RELATIONSHIP_GLOBAL);
61+
PathExpander expander = PathExpanders.forTypeAndDirection(RelationshipType.withName("Call"), Direction.OUTGOING );
62+
int maxDepth = (int) maxLength;
63+
64+
final Traverser traverse = tx.bidirectionalTraversalDescription()
65+
.startSide(
66+
base.expand(expander)
67+
.evaluator(Evaluators.toDepth(maxDepth / 2))
68+
).endSide(
69+
base.expand(expander.reverse())
70+
.evaluator(Evaluators.toDepth(maxDepth - maxDepth / 2))
71+
)
72+
.traverse(start, end);
73+
74+
Optional<Path> optionalPath = StreamSupport
75+
.stream(traverse.spliterator(), false).findFirst();
76+
77+
if (optionalPath.isPresent()){
78+
Path path = optionalPath.get();
79+
// System.out.println(path);
80+
List<Relationship> multiDispatchRelationship = getFirstMultiDispatch(path, callProperty);
81+
List<Path> pathList = multiDispatchRelationship.stream().map(this::relationShipToPath).collect(Collectors.toList());
82+
pathList.add(path);
83+
return pathList.stream().map(PathRecord::new);
84+
}else {
85+
return StreamSupport
86+
.stream(traverse.spliterator(), false).map(PathRecord::new);
87+
}
10088
}
10189

10290
public Path relationShipToPath(Relationship relationship){

src/main/java/com/bytecodedl/pathfinder/Util.java

Lines changed: 0 additions & 17 deletions
This file was deleted.

src/test/java/example/FindAnyOnePathTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ void findAnyOnePath() {
5959
// language=cypher
6060
var records = session.run("match (start:Source)" +
6161
"match (end: Sink) " +
62-
"call bytecodedl.findOnePath(start, end, '4', '0', 'insn') yield path return path").list();
62+
"call bytecodedl.findOnePath(start, end, 10, 'insn') yield path return path").list();
6363

6464
for(Record record : records){
6565
//System.out.println(record.get("path"));
@@ -70,7 +70,7 @@ void findAnyOnePath() {
7070
}
7171

7272
@Test
73-
void dijkstra() {
73+
void biFindOnePath() {
7474

7575
try(
7676
var driver = GraphDatabase.driver(embeddedDatabaseServer.boltURI());
@@ -79,8 +79,8 @@ void dijkstra() {
7979

8080
// language=cypher
8181
var records = session.run("match (start:Source)" +
82-
"match (end: Sink) " +
83-
"call bytecodedl.dijkstra(start, end, 'd', 1) yield path return path").list();
82+
"match (end: Sink1) " +
83+
"call bytecodedl.biFindOnePath(start, end, 10, 'insn') yield path return path").list();
8484

8585
for(Record record : records){
8686
//System.out.println(record.get("path"));

src/test/resources/call_graph.cypher

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ CREATE (D:Method {method:'methodd'})
77
CREATE (E:Method {method:'methode'})
88
CREATE (F:Method {method:'methodf'})
99
CREATE (S:Sink {method:'sink'})
10+
CREATE (S1:Sink1 {method:'sink1'})
1011

1112
CREATE (A)-[:Call {insn:'insnAB'}]->(B),
1213
(A)-[:Call {insn:'insnAC'}]->(C0),
@@ -18,7 +19,8 @@ CREATE (A)-[:Call {insn:'insnAB'}]->(B),
1819
(D)-[:Call {insn:'insnDS'}]->(S),
1920
(B)-[:Call {insn:'insnBE'}]->(E),
2021
(E)-[:Call {insn:'insnEF'}]->(F),
21-
(F)-[:Call {insn:'insnFS'}]->(S)
22+
(F)-[:Call {insn:'insnFS'}]->(S),
23+
(F)-[:Call {insn:'insnFS1'}]->(S1)
2224

2325

2426

0 commit comments

Comments
 (0)