2014-02-26 3 views
0

속성을 기반으로하는 일부 노드를 Neo4j Dijkstra 알고리즘에서 제외 할 수있는 방법이 있습니까?일부 노드를 제외하는 방법

알고 계시 겠지만 의 유형 및 방향에 허용 된 연관성 및 길 찾기를 설정할 수 있지만이 경우 제 도움이되지 않습니다.

코드 다음 한의 난을 가정 해 봅시다 :

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

다 익스트라는 속성 이름을 가진 노드를 통해 간다 '런던'방법이 경로를 실행 중지하고 다른 곳에서 계속?

답변

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

이 충분히 분명 희망 :이 같은 것을 (나는 귀하의 경우에 맞게 내 원래의 코드를 조금 수정하지만 여전히 버그가있을 수 있으므로 신중하게 볼을)했다. 질문이 있으시면 언제든지 저에게 질문하십시오.

+0

감사합니다. 한 가지 문제가 있습니다. 두 번째 재정의 변수 경로에서 오류가 발생했습니다. 어떻게 작동하는지 잘 모르겠습니다. 이 코드는 http://pastebin.com/wjShzxxA입니다. – EdWood

+0

@EdWood, 그건 내 잘못입니다. 프로세스에 적절한주의를 기울이지 않고 코드를 복사하여 붙여 넣었습니다. 지금 고쳤습니다. 다시 시도하십시오. – tkroman

+0

@EdWood, 물론 아무 일도 일어나지 않습니다! 또한 이미 사용하고있는 확장자 ('dijkstra'에 대한 인수) 대신에 확장자를 사용해야합니다. 당신은 단순한 클래스 정의에서 아무것도 기대할 수 없습니다 - 당신은 또한 그것을 인스턴스화하고 어딘가에 사용해야합니다.) – tkroman

관련 문제