package org.neo4j.graphalgo; import org.neo4j.graphalgo.impl.path.AStar; import org.neo4j.graphalgo.impl.path.AllPaths; import org.neo4j.graphalgo.impl.path.AllSimplePaths; import org.neo4j.graphalgo.impl.path.Dijkstra; import org.neo4j.graphalgo.impl.path.ShortestPath; import org.neo4j.graphdb.Node; import org.neo4j.graphdb.Path; import org.neo4j.graphdb.Relationship; import org.neo4j.graphdb.RelationshipExpander; /** * Static factory methods for the recommended implementations of common * graph algorithms for Neo4j. * * @author Mattias Persson */ public abstract class GraphAlgoFactory { /** * Returns an algorithm which can find all available paths between two * nodes. These returned paths can contain loops (i.e. a node can occur * more than once in any returned path). * @see AllPaths * @param expander the {@link RelationshipExpander} to use for expanding * {@link Relationship}s for each {@link Node}. * @param maxDepth the max {@link Path#length()} returned paths are * allowed to have. * @return an algorithm which finds all paths between two nodes. */ public static PathFinder<Path> allPaths( RelationshipExpander expander, int maxDepth ) { return new AllPaths( maxDepth, expander ); } /** * Returns an algorithm which can find all simple paths between two * nodes. These returned paths cannot contain loops (i.e. a node cannot * occur more than once in any returned path). * @see AllSimplePaths * @param expander the {@link RelationshipExpander} to use for expanding * {@link Relationship}s for each {@link Node}. * @param maxDepth the max {@link Path#length()} returned paths are * allowed to have. * @return an algorithm which finds simple paths between two nodes. */ public static PathFinder<Path> allSimplePaths( RelationshipExpander expander, int maxDepth ) { return new AllSimplePaths( maxDepth, expander ); } /** * Returns an algorithm which can find all shortest paths (that is paths * with as short {@link Path#length()} as possible) between two nodes. These * returned paths cannot contain loops (i.e. a node cannot occur more than * once in any returned path). * * @see ShortestPath * @param expander the {@link RelationshipExpander} to use for expanding * {@link Relationship}s for each {@link Node}. * @param maxDepth the max {@link Path#length()} returned paths are allowed * to have. * @return an algorithm which finds shortest paths between two nodes. */ public static PathFinder<Path> shortestPath( RelationshipExpander expander, int maxDepth ) { return new ShortestPath( maxDepth, expander ); } /** * Returns an {@link PathFinder} which uses the A* algorithm to find the * cheapest path between two nodes. The definition of "cheap" is the lowest * possible cost to get from the start node to the end node, where the cost * is returned from {@code lengthEvaluator} and {@code estimateEvaluator}. * These returned paths cannot contain loops (i.e. a node cannot occur more * than once in any returned path). * * See http://en.wikipedia.org/wiki/A*_search_algorithm for more * information. * * @see AStar * @param expander the {@link RelationshipExpander} to use for expanding * {@link Relationship}s for each {@link Node}. * @param lengthEvaluator evaluator that can return the cost represented * by each relationship the algorithm traverses. * @param estimateEvaluator evaluator that returns an (optimistic) * estimation of the cost to get from the current node (in the traversal) * to the end node. * @return an algorithm which finds the cheapest path between two nodes * using the A* algorithm. */ public static PathFinder<WeightedPath> aStar( RelationshipExpander expander, CostEvaluator<Double> lengthEvaluator, EstimateEvaluator<Double> estimateEvaluator ) { return new AStar( expander, lengthEvaluator, estimateEvaluator ); } /** * Returns an {@link PathFinder} which uses the Dijkstra algorithm to find * the cheapest path between two nodes. The definition of "cheap" is the * lowest possible cost to get from the start node to the end node, where * the cost is returned from {@code costEvaluator}. These returned paths * cannot contain loops (i.e. a node cannot occur more than once in any * returned path). * * See http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm for more * information. * * @see Dijkstra * @param expander the {@link RelationshipExpander} to use for expanding * {@link Relationship}s for each {@link Node}. * @param costEvaluator evaluator that can return the cost represented * by each relationship the algorithm traverses. * @return an algorithm which finds the cheapest path between two nodes * using the Dijkstra algorithm. */ public static PathFinder<WeightedPath> dijkstra( RelationshipExpander expander, CostEvaluator<Double> costEvaluator ) { return new Dijkstra( expander, costEvaluator ); } }