【问题标题】:How to exclude some nodes如何排除某些节点
【发布时间】:2014-02-26 20:45:00
【问题描述】:

有什么方法可以根据属性从 Neo4j Dijkstra 算法中排除某些特定节点?

我知道,我可以在方法 forTypeAndDirection 中设置允许的关系和方向,但这对我的情况没有帮助。

假设我有以下代码:

try (Transaction tx = graphDb.beginTx()) {

    Node startNode = graphDb.getNodeById(12353);
    Node endNode = graphDb.getNodeById(12356);

    CostEvaluator<Double> costEvaluator = new CostEvaluator<Double>() {
        @Override
        public Double getCost(Relationship relationship, Direction direction) {
        Integer cost = Integer.parseInt(relationship.getProperty("cost").toString());               
            return cost.doubleValue();
        }
    };      

    PathFinder<WeightedPath> finder = GraphAlgoFactory.dijkstra(
        PathExpanders.forTypeAndDirection( RelationshipTypes.RELATED, Direction.OUTGOING), costEvaluator );

        WeightedPath path = finder.findSinglePath( startNode, endNode );        
        System.out.println(path.length());
        tx.success();
    }
}

当 Dijkstra 通过属性名称为:'London' 的节点时,如何停止执行此路径并在其他地方继续执行?

【问题讨论】:

    标签: java neo4j dijkstra


    【解决方案1】:

    我最近遇到了一个类似的问题,我需要自定义 PathExpander 来执行一些遍历。我做了这样的事情(我修改了我的原始代码以适应你的情况,但它仍然可能是错误的,所以仔细看看):

    final private static class FilteringExpander implements PathExpander {
        private final Direction direction;
    
        private FilteringExpander(final Direction direction) {
            this.direction = direction;
        }
    
        public FilteringExpander() {
            this.direction = Direction.OUTGOING;
        }
    
        @Override
        public Iterable<Relationship> expand(Path neoPath, BranchState state) {
            if (!neoPath.endNode().getProperty("name").equals("London")) {
                return neoPath.endNode().getRelationships(RelationshipTypes.RELATED, direction);
            } else {
                return Collections.emptyList();
            }
        }
    
        @Override
        public PathExpander reverse() {
            return new FilteringExpander(direction.reverse());
        }
    }
    

    希望它足够清楚。如果您有任何问题,请随时问我。

    【讨论】:

    • 谢谢,一个问题。我在第二次覆盖中的变量路径上有错误,我不确定它是如何工作的。这是我的代码:pastebin.com/wjShzxxA.
    • @EdWood,这是我的错,我只是复制粘贴了代码,没有对过程给予足够的关注。现在修复它,再试一次。
    • @EdWood,当然什么也没发生!您还必须使用扩展器而不是您已经在使用的扩展器(作为dijkstra 的参数)。你不能从单纯的类定义中得到任何期望——你也应该实例化它并在某个地方使用;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    相关资源
    最近更新 更多