关于neo4j:基于关系属性的最长路径

Longest path based on relationship property

我需要根据关系的特定属性的顺序在Neo4j图中找到最长的路径。

想象一下,该关系具有像这样的整数类型的属性date
[:Like {date:20140812}]

考虑路径:
A-[r1:Like]->B-[r2:Like]->C

仅当r1.date < r2.date时,此路径才有效

问题是如何使用Cypher找到最长的路径。


您可以执行类似的操作,但是在密码处理方面并不是很有效。
我仍然会限制最大路径长度,以防止其爆炸。

我可能会使用Java API实现类似的功能。

您可以尝试使用Neo4j 2.1中带有cypher 2.1.experimental前缀的新查询计划程序来运行它。

1
2
3
4
5
6
MATCH (a:Label {prop:value})
MATCH path = (a)-[r:Like*10]->(b)
WHERE ALL(idx in range(1,length(path)-1) WHERE r[idx-1].date < r[idx].date)
RETURN path, length(path) as len
ORDER BY len DESC
LIMIT 1

在Java中将是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    TraversalDescription traversal = db.traversalDescription().depthFirst().evaluator(new PathEvaluator.Adapter<Long>() {
        @Override
        public Evaluation evaluate(Path path, BranchState<Long> state) {
            if (path.length() == 0) return Evaluation.INCLUDE_AND_CONTINUE;
            Long date = (Long) path.lastRelationship().getProperty("date");
            Long stateDate = state.getState();
            state.setState(date);
            if (stateDate != null) {
                return stateDate < date ? Evaluation.INCLUDE_AND_CONTINUE : Evaluation.EXCLUDE_AND_PRUNE;
            }
            return Evaluation.INCLUDE_AND_CONTINUE;
        }
    });
    int length = 0;
    Path result;
    for (Path path : traversal.traverse(startNode)) {
        if (path.length() > length) {
            result = path;
            length = path.length();
        }
    }