mirror of https://gitee.com/bigwinds/arangodb
Doc - Dataset and example for Multiple Path Search (#5483)
This commit is contained in:
parent
861f4cef92
commit
9d622c566c
|
@ -10,32 +10,33 @@ then a shortest path query from **A** to **C** may return the path `A -> B -> C`
|
||||||
|
|
||||||
You can use the efficient shortest path algorithm however, to determine the shortest path length:
|
You can use the efficient shortest path algorithm however, to determine the shortest path length:
|
||||||
|
|
||||||
```
|
|
||||||
RETURN LENGTH(
|
@startDocuBlockInline GRAPHTRAV_multiplePathSearch
|
||||||
FOR v IN OUTBOUND
|
@EXAMPLE_AQL{GRAPHTRAV_multiplePathSearch}
|
||||||
SHORTEST_PATH "verts/A" TO "verts/C" edges
|
@DATASET{mps_graph}
|
||||||
RETURN v
|
RETURN LENGTH(
|
||||||
)
|
FOR v IN OUTBOUND
|
||||||
```
|
SHORTEST_PATH "verts/A" TO "verts/C" edges
|
||||||
|
RETURN v
|
||||||
|
)
|
||||||
|
@END_EXAMPLE_AQL
|
||||||
|
@endDocuBlock GRAPHTRAV_multiplePathSearch
|
||||||
|
|
||||||
|
|
||||||
The result is 3 for the example graph (includes the start vertex). Now, subtract 1 to get the edge count / traversal depth. You can run a pattern matching traversal to find all paths with this length (or longer ones by increasing the min and max depth). Starting point is **A** again, and a filter on the document ID of v (or p.vertices[-1]) ensures that we only retrieve paths that end at point **C**.
|
The result is 3 for the example graph (includes the start vertex). Now, subtract 1 to get the edge count / traversal depth. You can run a pattern matching traversal to find all paths with this length (or longer ones by increasing the min and max depth). Starting point is **A** again, and a filter on the document ID of v (or p.vertices[-1]) ensures that we only retrieve paths that end at point **C**.
|
||||||
|
|
||||||
The following query returns all parts with length 2, start vertex **A** and target vertex **C**:
|
The following query returns all parts with length 2, start vertex **A** and target vertex **C**:
|
||||||
|
|
||||||
```
|
|
||||||
FOR v, e, p IN 2..2 OUTBOUND "verts/A" edges
|
|
||||||
FILTER v._id == "verts/C"
|
|
||||||
RETURN CONCAT_SEPARATOR(" -> ", p.vertices[*]._key)
|
|
||||||
```
|
|
||||||
|
|
||||||
Output:
|
@startDocuBlockInline GRAPHTRAV_multiplePathSearch2
|
||||||
|
@EXAMPLE_AQL{GRAPHTRAV_multiplePathSearch2}
|
||||||
|
@DATASET{mps_graph}
|
||||||
|
FOR v, e, p IN 2..2 OUTBOUND "verts/A" edges
|
||||||
|
FILTER v._id == "verts/C"
|
||||||
|
RETURN CONCAT_SEPARATOR(" -> ", p.vertices[*]._key)
|
||||||
|
@END_EXAMPLE_AQL
|
||||||
|
@endDocuBlock GRAPHTRAV_multiplePathSearch2
|
||||||
|
|
||||||
```
|
|
||||||
[
|
|
||||||
"A -> B -> C",
|
|
||||||
"A -> D -> C"
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
A traversal depth of `3..3` would return `A -> E -> F -> C` and `2..3` all three paths.
|
A traversal depth of `3..3` would return `A -> E -> F -> C` and `2..3` all three paths.
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
@Q:
|
||||||
|
RETURN LENGTH(
|
||||||
|
FOR v IN OUTBOUND
|
||||||
|
SHORTEST_PATH <span class="hljs-string">"verts/A"</span> TO <span class="hljs-string">"verts/C"</span> edges
|
||||||
|
RETURN v
|
||||||
|
)
|
||||||
|
|
||||||
|
@R
|
||||||
|
[
|
||||||
|
<span class="hljs-number">3</span>
|
||||||
|
]
|
|
@ -0,0 +1,10 @@
|
||||||
|
@Q:
|
||||||
|
FOR v, e, p IN <span class="hljs-number">2.</span><span class="hljs-number">.2</span> OUTBOUND <span class="hljs-string">"verts/A"</span> edges
|
||||||
|
FILTER v._id == <span class="hljs-string">"verts/C"</span>
|
||||||
|
RETURN CONCAT_SEPARATOR(<span class="hljs-string">" -> "</span>, p.vertices[*]._key)
|
||||||
|
|
||||||
|
@R
|
||||||
|
[
|
||||||
|
<span class="hljs-string">"A -> B -> C"</span>,
|
||||||
|
<span class="hljs-string">"A -> D -> C"</span>
|
||||||
|
]
|
|
@ -37,6 +37,14 @@ exports.Examples = {
|
||||||
examples.dropGraph("traversalGraph");
|
examples.dropGraph("traversalGraph");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
'mps_graph': {
|
||||||
|
createDS: function() {
|
||||||
|
examples.loadGraph("mps_graph");
|
||||||
|
},
|
||||||
|
removeDS: function() {
|
||||||
|
examples.dropGraph("mps_graph");
|
||||||
|
}
|
||||||
|
},
|
||||||
'joinSampleDataset': {
|
'joinSampleDataset': {
|
||||||
createDS: function() {
|
createDS: function() {
|
||||||
db._create("users");
|
db._create("users");
|
||||||
|
|
|
@ -52,6 +52,28 @@ var createTraversalExample = function () {
|
||||||
return g;
|
return g;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// we create a graph with 'edges' pointing from 'verts' to 'verts'
|
||||||
|
var createMpsTraversal = function () {
|
||||||
|
var g = Graph._create('mps_graph',
|
||||||
|
[Graph._relation('edges', 'verts', 'verts')]
|
||||||
|
);
|
||||||
|
var a = g.verts.save({_key: 'A'});
|
||||||
|
var b = g.verts.save({_key: 'B'});
|
||||||
|
var c = g.verts.save({_key: 'C'});
|
||||||
|
var d = g.verts.save({_key: 'D'});
|
||||||
|
var e = g.verts.save({_key: 'E'});
|
||||||
|
var f = g.verts.save({_key: 'F'});
|
||||||
|
g.edges.save(a._id, b._id, {vertex:a._key});
|
||||||
|
g.edges.save(a._id, e._id, {vertex:a._key});
|
||||||
|
g.edges.save(a._id, d._id, {vertex:a._key});
|
||||||
|
g.edges.save(b._id, c._id, {vertex:b._key});
|
||||||
|
g.edges.save(d._id, c._id, {vertex:d._key});
|
||||||
|
g.edges.save(e._id, f._id, {vertex:e._key});
|
||||||
|
g.edges.save(f._id, c._id, {vertex:f._key});
|
||||||
|
return g;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
// we create a graph with 'relation' pointing from 'female' to 'male' and 'male
|
// we create a graph with 'relation' pointing from 'female' to 'male' and 'male
|
||||||
var createSocialGraph = function () {
|
var createSocialGraph = function () {
|
||||||
db._create("female");
|
db._create("female");
|
||||||
|
@ -375,6 +397,9 @@ var knownGraphs = {
|
||||||
'knows_graph': {create: createTraversalExample, dependencies: [
|
'knows_graph': {create: createTraversalExample, dependencies: [
|
||||||
'knows', 'persons'
|
'knows', 'persons'
|
||||||
]},
|
]},
|
||||||
|
'mps_graph': {create: createMpsTraversal, dependencies: [
|
||||||
|
'edges', 'verts'
|
||||||
|
]},
|
||||||
'routeplanner': {create: createRoutePlannerGraph, dependencies: [
|
'routeplanner': {create: createRoutePlannerGraph, dependencies: [
|
||||||
'frenchHighway', 'frenchCity', 'germanCity', 'germanHighway', 'internationalHighway'
|
'frenchHighway', 'frenchCity', 'germanCity', 'germanHighway', 'internationalHighway'
|
||||||
]},
|
]},
|
||||||
|
|
Loading…
Reference in New Issue