Skip to content

Commit 5179957

Browse files
committed
finish MonoDirectionalTraversal
1 parent 194a955 commit 5179957

File tree

4 files changed

+69
-46
lines changed

4 files changed

+69
-46
lines changed

pom.xml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,11 @@
4141
<scope>provided</scope>
4242
</dependency>
4343

44-
<dependency>
45-
<groupId>org.neo4j</groupId>
46-
<artifactId>neo4j-graph-algo</artifactId>
47-
<version>5.12.0</version>
48-
</dependency>
44+
<!-- <dependency>-->
45+
<!-- <groupId>org.neo4j</groupId>-->
46+
<!-- <artifactId>neo4j-graph-algo</artifactId>-->
47+
<!-- <version>5.12.0</version>-->
48+
<!-- </dependency>-->
4949

5050
<!-- Test Dependencies -->
5151
<dependency>

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

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@
44
import org.neo4j.graphdb.Node;
55
import org.neo4j.graphdb.Path;
66
import org.neo4j.graphdb.Relationship;
7+
import org.neo4j.graphdb.traversal.BranchState;
78
import org.neo4j.graphdb.traversal.Evaluation;
89
import org.neo4j.graphdb.traversal.Evaluator;
10+
import org.neo4j.graphdb.traversal.PathEvaluator;
11+
import org.neo4j.logging.Log;
912

1013
import java.util.List;
1114
import java.util.stream.Collectors;
@@ -15,23 +18,28 @@
1518
1619
* @date 2023/12/16 16:40
1720
*/
18-
public class FindAnyOneEvaluator implements Evaluator {
21+
public class FindAnyOneEvaluator extends PathEvaluator.Adapter {
1922
private boolean hasFound;
2023
private Node endNode;
2124
private int maxLength;
2225
private int minLength;
2326

24-
public FindAnyOneEvaluator(Node endNode, String maxLength, String minLength){
27+
private Log log;
28+
29+
public FindAnyOneEvaluator(Node endNode, String maxLength, String minLength, Log log){
2530
this.hasFound = false;
2631
this.endNode = endNode;
2732
this.maxLength = Integer.parseInt(maxLength);
2833
this.minLength = Integer.parseInt(minLength);
34+
this.log = log;
2935
}
3036

3137
@Override
32-
public Evaluation evaluate(Path path) {
38+
public Evaluation evaluate(Path path, BranchState state) {
3339
//String p = StreamSupport.stream(path.nodes().spliterator(), false).map(node -> (String)(node.getProperty("method"))).collect(Collectors.joining("->"));
3440
//System.out.println(p);
41+
this.log.info(path.toString());
42+
this.log.info("evaluate path length " + path.length());
3543

3644
if (hasFound){
3745
return Evaluation.EXCLUDE_AND_PRUNE;
@@ -44,6 +52,8 @@ public Evaluation evaluate(Path path) {
4452
Node pathEndNode = path.endNode();
4553
if ((path.length() >= this.minLength) &&(pathEndNode.equals(endNode))){
4654
this.hasFound = true;
55+
state.setState(true);
56+
this.log.info("found path " + path);
4757
//System.out.println("INCLUDE_AND_PRUNE");
4858
return Evaluation.INCLUDE_AND_PRUNE;
4959
}

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

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,31 @@
77
import org.neo4j.graphdb.ResourceIterable;
88
import org.neo4j.graphdb.traversal.BranchState;
99
import org.neo4j.internal.helpers.collection.Iterables;
10+
import org.neo4j.logging.Log;
1011

1112
/**
1213
1314
* @date 2023/12/23 13:53
1415
*/
15-
public class FindAnyOneExpander implements PathExpander<Double> {
16+
public class FindAnyOneExpander implements PathExpander<Boolean> {
17+
private PathExpander expander;
18+
private Log log;
19+
public FindAnyOneExpander(PathExpander expander, Log log){
20+
this.expander = expander;
21+
this.log = log;
22+
}
1623
@Override
17-
public ResourceIterable<Relationship> expand(Path path, BranchState<Double> branchState) {
24+
public ResourceIterable<Relationship> expand(Path path, BranchState<Boolean> branchState) {
25+
this.log.info("expand path length " + path.length());
26+
27+
if (!branchState.getState()){
28+
return this.expander.expand(path, branchState);
29+
}
1830
return Iterables.emptyResourceIterable();
1931
}
2032

2133
@Override
22-
public PathExpander<Double> reverse() {
23-
return null;
34+
public PathExpander<Boolean> reverse() {
35+
return new FindAnyOneExpander(this.expander.reverse(), this.log);
2436
}
2537
}

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

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.neo4j.graphalgo.impl.util.PathImpl;
77
import org.neo4j.graphdb.*;
88
import org.neo4j.graphdb.traversal.Evaluators;
9+
import org.neo4j.graphdb.traversal.InitialBranchState;
910
import org.neo4j.graphdb.traversal.Traverser;
1011
import org.neo4j.graphdb.traversal.Uniqueness;
1112
import org.neo4j.logging.Log;
@@ -37,10 +38,10 @@ public Stream<PathRecord> findOnePath(@Name("start") Node start, @Name("end") No
3738
final Traverser traverse = tx.traversalDescription()
3839
//.depthFirst()
3940
.breadthFirst()
40-
.evaluator(new FindAnyOneEvaluator(end, maxLength, minLength))
41-
//.expand(new FindAnyOneExpander())
42-
.expand(PathExpanders.forTypeAndDirection( RelationshipType.withName("Call"), Direction.OUTGOING ))
43-
.uniqueness(Uniqueness.NODE_PATH)
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 ))
44+
.uniqueness(Uniqueness.NODE_GLOBAL)
4445
.traverse(start);
4546

4647
Optional<Path> optionalPath = StreamSupport
@@ -58,36 +59,36 @@ public Stream<PathRecord> findOnePath(@Name("start") Node start, @Name("end") No
5859
}
5960
}
6061

61-
@Procedure(name = "bytecodedl.dijkstra", mode = Mode.READ)
62-
@Description("find one path from start to end between minlength and maxlength, also show first multi dispatch")
63-
public Stream<PathRecord> dijkstra(
64-
@Name("startNode") Node startNode,
65-
@Name("endNode") Node endNode,
66-
@Name("weightPropertyName") String weightPropertyName,
67-
@Name(value = "defaultWeight", defaultValue = "NaN") double defaultWeight,
68-
@Name(value = "numberOfWantedPaths", defaultValue = "1") long numberOfWantedPaths
69-
){
70-
PathFinder<WeightedPath> algo = GraphAlgoFactory.dijkstra(
71-
buildPathExpander(),
72-
(relationship, direction) -> Util.toDouble(relationship.getProperty(weightPropertyName, defaultWeight)),
73-
(int)numberOfWantedPaths
74-
);
75-
Iterable<WeightedPath> paths = algo.findAllPaths(startNode, endNode);
76-
77-
Optional<WeightedPath> optionalPath = StreamSupport
78-
.stream(paths.spliterator(), false).findFirst();
79-
80-
if (optionalPath.isPresent()){
81-
Path path = optionalPath.get();
82-
List<Relationship> multiDispatchRelationship = getFirstMultiDispatch(path, "insn");
83-
List<Path> pathList = multiDispatchRelationship.stream().map(this::relationShipToPath).collect(Collectors.toList());
84-
pathList.add(path);
85-
return pathList.stream().map(PathRecord::new);
86-
}else {
87-
return StreamSupport
88-
.stream(paths.spliterator(), false).map(PathRecord::new);
89-
}
90-
}
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+
// }
9192

9293
public PathExpander<Double> buildPathExpander() {
9394
// PathExpanderBuilder builder = PathExpanderBuilder.allTypesAndDirections();

0 commit comments

Comments
 (0)