Hi,
I have a REST plugin to cut short dijkstra expansion. I also tested for
unit costs so that it behaves like DFS (except for the logn work spent on
queue operations) but the results are still significantly different than
allshortestpath ( 4sec (ASP) vs 30sec(Dijkstra) average times over 20
random requests). This was to make sure that the algorithm was not spending
any time fetching the cost property. All the requests were made after
warming up the cache.
My schema is:
- (Person)-[attended]->(School)
- (Person)-[likes]->(Hobby)
- (Person)-[studied]->(Education)
- (Person)-[owns]->(Gaming console)
- (Person)-[plays]->(Game)
- (Game)-[runson]->(Gaming console)
Each relationship type has a weight associated, which is used by Dijkstra.
eg: 8 for runson, 4 for likes etc.
The majority of the nodes are of Person types (2.2M) or Game types(0.3M).
System information:
- #CPU cores - 4
- RAM - 32G
- GCCompiler - Concurrent Mark Sweep
- Page size - 10G
- DB version - 2.3.0 Community
DijkstraPlugin.java Method
@Description( "Find the minimum cost path between two nodes using
dijkstra." )
@PluginTarget( Node.class )
public Path dijkstraSinglePath(
@Source Node source,
@Description( "The node to find the shortest path to." )
@Parameter( name = "target" ) Node target,
@Description( "The relationship types to follow when searching
for the shortest path(s). " +
"Order is insignificant, if omitted all types are followed." )
@Parameter( name = "types", optional = true ) String[]
types,
@Description( "The maximum path length to search for, default value (if
omitted) is 4." )
@Parameter( name = "depth", optional = false ) Integer
depth ,
@Description( "The relationship types to follow when searching for the
shortest path(s). " +
"Order is insignificant, if omitted all types are followed." )
@Parameter( name = "cost_property", optional = false )
String cost_property)
{
PathExpander<?> expander = new DepthLimitedExpander(depth);
Path path;
try (Transaction tx = source.getGraphDatabase().beginTx())
{
PathFinder<WeightedPath> shortestPath =
GraphAlgoFactory.dijkstra(expander, cost_property);
path = shortestPath.findSinglePath(source, target);
tx.success();
}
return path;
}
PathExpander
public class DepthLimitedExpander implements PathExpander
{
private final int depth;
DepthLimitedExpander ( int depth)
{
this.depth = depth;
}
@Override public Iterable<Relationship> expand(Path path, BranchState
state) {
if (path.length() > this.depth-1) {
return Collections.emptyList();
}
return path.endNode().getRelationships( );
}
@Override public DepthLimitedExpander reverse() {
return new DepthLimitedExpander(this.depth);
}
}
On Friday, June 19, 2015 at 6:25:27 PM UTC-4, Michael Hunger wrote:
>
> can you share your code, and how you ran dijkstra and your graph structure
> and perhaps your database?
> Otherwise it's impossible to reproduce.
>
> Michael
>
> On Fri, Jun 19, 2015 at 11:32 PM, mayank gupta <[email protected]
> <javascript:>> wrote:
>
>> Hi,
>>
>> I have a graph with 3M nodes and 10M edges.
>> I tried running Dijkstra to get all shortest path but it gets stuck
>> indefinitely.
>> I wrote a plugin to cut short Dijkstra for getting a single path upto a
>> certain depth and that gave me an average response time of 40 seconds for
>> depth 10.
>>
>> AllShortestPath however returns in average 4 seconds, sometimes returning
>> >100 different paths. Is there anything I am missing because the
>> performance difference seems significant.
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Neo4j" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected] <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>
--
You received this message because you are subscribed to the Google Groups
"Neo4j" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.