我需要根据关系的特定属性顺序找到Neo4j图中最长的路径。
想象一下,这种关系具有类似整数类型的属性date
[:Like {date:20140812}]
考虑路径:
A-[r1:Like]->B-[r2:Like]->C
仅当r1.date < r2.date
问题是如何找到Cypher的最长路径。
答案 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();
}
}