Skip to content

Commit 45f0539

Browse files
committed
update readme
1 parent 36fc00f commit 45f0539

File tree

3 files changed

+33
-24
lines changed

3 files changed

+33
-24
lines changed

Dockerfile

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
From neo4j:5.12.0
2+
3+
LABEL maintainer="yxxx <[email protected]>"
4+
5+
COPY target/bytecodedl-pathfinder-1.0.0.jar /var/lib/neo4j/plugins
6+
7+
ENV NEO4J_AUTH=neo4j/bytecodedl \
8+
NEO4J_dbms_security_procedures_unrestricted=bytecodedl.*

README.md

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,20 @@
55

66
### 简介
77

8-
实现了自定义procedure `bytecodedl.findOnePath`
9-
具体函数签名如下
10-
11-
`findOnePath(@Name("start") Node start, @Name("end") Node end, @Name("maxLength") String maxLength, @Name("minLength") String minLength, @Name("callProperty") String callProperty)`
8+
实现了自定义procedure
9+
- `bytecodedl.findOnePath`
10+
- `findOnePath(@Name("start") Node start, @Name("end") Node end, @Name("maxLength") Long maxLength @Name("callProperty") String callProperty)`
11+
- `bytecodedl.biFindOnePath`
12+
- `biFindOnePath(@Name("start") Node start, @Name("end") Node end, @Name("maxLength") Long maxLength @Name("callProperty") String callProperty)`
1213

1314
功能包括:
14-
- 从start到end找到任意一条路径就返回,长度在minlength和maxlength之间
15-
- 然后找到该路径第一个存在multi dispatch的边,同时返回所有的边
15+
- 从start到end找到长度小于maxlength任意一条路径就返回 -> 速度较快
16+
- 然后找到该路径第一个存在multi dispatch的边,同时返回所有的dispatch结果 -> 方便排查virtual invoke存在多个callee的情况
17+
18+
### 安装
19+
20+
- 手动安装
21+
-[releases](https://github.com/BytecodeDL/bytecodedl-pathfinder-neo4j-procedure/releases/)下载最新的jar, 然后放到neo4j的`/var/lib/neo4j/plugins`目录
22+
- 然后在`/var/lib/neo4j/conf/neo4j.conf`增加一行`dbms.security.procedures.unrestricted=bytecodedl.*`
23+
- docker
24+
-

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

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -32,26 +32,14 @@ public class FindAnyOnePath {
3232
@Procedure(name = "bytecodedl.findOnePath", mode = Mode.READ)
3333
@Description("find one path from start to end under maxlength, also show first multi dispatch")
3434
public Stream<PathRecord> findOnePath(@Name("start") Node start, @Name("end") Node end, @Name("maxLength") long maxLength, @Name("callProperty") String callProperty){
35-
final Traverser traverse = tx.traversalDescription()
35+
final Traverser traverser = tx.traversalDescription()
3636
.breadthFirst()
3737
.evaluator(Evaluators.toDepth((int)maxLength))
3838
.expand(PathExpanders.forTypeAndDirection(RelationshipType.withName("Call"), Direction.OUTGOING ))
3939
.uniqueness(Uniqueness.NODE_GLOBAL)
4040
.traverse(start);
4141

42-
Optional<Path> optionalPath = StreamSupport
43-
.stream(traverse.spliterator(), false).findFirst();
44-
45-
if (optionalPath.isPresent()){
46-
Path path = optionalPath.get();
47-
List<Relationship> multiDispatchRelationship = getFirstMultiDispatch(path, callProperty);
48-
List<Path> pathList = multiDispatchRelationship.stream().map(this::relationShipToPath).collect(Collectors.toList());
49-
pathList.add(path);
50-
return pathList.stream().map(PathRecord::new);
51-
}else {
52-
return StreamSupport
53-
.stream(traverse.spliterator(), false).map(PathRecord::new);
54-
}
42+
return returnWithFirstMultiDispatch(traverser, callProperty);
5543
}
5644

5745
@Procedure(name = "bytecodedl.biFindOnePath", mode = Mode.READ)
@@ -61,7 +49,7 @@ public Stream<PathRecord> biFindOnePath(@Name("start") Node start, @Name("end")
6149
PathExpander expander = PathExpanders.forTypeAndDirection(RelationshipType.withName("Call"), Direction.OUTGOING );
6250
int maxDepth = (int) maxLength;
6351

64-
final Traverser traverse = tx.bidirectionalTraversalDescription()
52+
final Traverser traverser = tx.bidirectionalTraversalDescription()
6553
.startSide(
6654
base.expand(expander)
6755
.evaluator(Evaluators.toDepth(maxDepth / 2))
@@ -71,19 +59,23 @@ public Stream<PathRecord> biFindOnePath(@Name("start") Node start, @Name("end")
7159
)
7260
.traverse(start, end);
7361

62+
return returnWithFirstMultiDispatch(traverser, callProperty);
63+
64+
}
65+
66+
public Stream<PathRecord> returnWithFirstMultiDispatch(Traverser traverser, String callProperty){
7467
Optional<Path> optionalPath = StreamSupport
75-
.stream(traverse.spliterator(), false).findFirst();
68+
.stream(traverser.spliterator(), false).findFirst();
7669

7770
if (optionalPath.isPresent()){
7871
Path path = optionalPath.get();
79-
// System.out.println(path);
8072
List<Relationship> multiDispatchRelationship = getFirstMultiDispatch(path, callProperty);
8173
List<Path> pathList = multiDispatchRelationship.stream().map(this::relationShipToPath).collect(Collectors.toList());
8274
pathList.add(path);
8375
return pathList.stream().map(PathRecord::new);
8476
}else {
8577
return StreamSupport
86-
.stream(traverse.spliterator(), false).map(PathRecord::new);
78+
.stream(traverser.spliterator(), false).map(PathRecord::new);
8779
}
8880
}
8981

0 commit comments

Comments
 (0)