基于关系属性的最长路径

时间:2014-08-13 12:01:26

标签: neo4j cypher

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

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

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

仅当r1.date < r2.date

时,这是有效路径

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

1 个答案:

答案 0 :(得分:2)

你可以做这样的事情,但在密码中效率不高。 我仍然会限制max-path-length以防止它爆炸。

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

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

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中,它将是这样的:

    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();
        }
    }