Longest path based on relationship property
我需要根据关系的特定属性的顺序在Neo4j图中找到最长的路径。
想象一下,该关系具有像这样的整数类型的属性
考虑路径:
仅当
问题是如何使用Cypher找到最长的路径。
您可以执行类似的操作,但是在密码处理方面并不是很有效。
我仍然会限制最大路径长度,以防止其爆炸。
我可能会使用Java API实现类似的功能。
您可以尝试使用Neo4j 2.1中带有
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(); } } |