1
0
Fork 0
arangodb/Documentation/Books/AQL/examples-combining-graph-tr...

110 lines
4.8 KiB
Markdown

---
layout: default
description: Our first example will locate the start vertex for a graph traversal via a geo index
---
Combining Graph Traversals
==========================
Finding the start vertex via a geo query
----------------------------------------
Our first example will locate the start vertex for a graph traversal via [a geo index](../indexing-geo.html).
We use [the city graph](../graphs.html#the-city-graph) and its geo indices:
![Cities Example Graph](../images/cities_graph.png)
{% arangoshexample examplevar="examplevar" script="script" result="result" %}
@startDocuBlockInline COMBINING_GRAPH_01_create_graph
@EXAMPLE_ARANGOSH_OUTPUT{COMBINING_GRAPH_01_create_graph}
var examples = require("@arangodb/graph-examples/example-graph.js");
var g = examples.loadGraph("routeplanner");
~examples.dropGraph("routeplanner");
@END_EXAMPLE_ARANGOSH_OUTPUT
@endDocuBlock COMBINING_GRAPH_01_create_graph
{% endarangoshexample %}
{% include arangoshexample.html id=examplevar script=script result=result %}
We search all german cities in a range of 400 km around the ex-capital **Bonn**: **Hamburg** and **Cologne**.
We won't find **Paris** since its in the `frenchCity` collection.
{% aqlexample examplevar="examplevar" type="type" query="query" bind="bind" result="result" %}
@startDocuBlockInline COMBINING_GRAPH_02_show_geo
@EXAMPLE_AQL{COMBINING_GRAPH_02_show_geo}
@DATASET{routeplanner}
FOR startCity IN germanCity
FILTER GEO_DISTANCE(@bonn, startCity.geometry) < @radius
RETURN startCity._key
@BV {
bonn: [7.0998, 50.7340],
radius: 400000
}
@END_EXAMPLE_AQL
@endDocuBlock COMBINING_GRAPH_02_show_geo
{% endaqlexample %}
{% include aqlexample.html id=examplevar query=query bind=bind result=result %}
Lets revalidate that the geo indices are actually used:
{% aqlexample examplevar="examplevar" type="type" query="query" bind="bind" result="result" %}
@startDocuBlockInline COMBINING_GRAPH_03_explain_geo
@EXAMPLE_AQL{COMBINING_GRAPH_03_explain_geo}
@DATASET{routeplanner}
@EXPLAIN{TRUE}
FOR startCity IN germanCity
FILTER GEO_DISTANCE(@bonn, startCity.geometry) < @radius
RETURN startCity._key
@BV {
bonn: [7.0998, 50.7340],
radius: 400000
}
@END_EXAMPLE_AQL
@endDocuBlock COMBINING_GRAPH_03_explain_geo
{% endaqlexample %}
{% include aqlexample.html id=examplevar query=query bind=bind result=result %}
And now combine this with a graph traversal:
{% aqlexample examplevar="examplevar" type="type" query="query" bind="bind" result="result" %}
@startDocuBlockInline COMBINING_GRAPH_04_combine
@EXAMPLE_AQL{COMBINING_GRAPH_04_combine}
@DATASET{routeplanner}
FOR startCity IN germanCity
FILTER GEO_DISTANCE(@bonn, startCity.geometry) < @radius
FOR v, e, p IN 1..1 OUTBOUND startCity
GRAPH 'routeplanner'
RETURN {startcity: startCity._key, traversedCity: v._key}
@BV {
bonn: [7.0998, 50.7340],
radius: 400000
}
@END_EXAMPLE_AQL
@endDocuBlock COMBINING_GRAPH_04_combine
{% endaqlexample %}
{% include aqlexample.html id=examplevar query=query bind=bind result=result %}
The geo index query returns us `startCity` (**Cologne** and **Hamburg**) which we then use as starting point for our graph traversal.
For simplicity we only return their direct neighbours. We format the return result so we can see from which `startCity` the traversal came.
Alternatively we could use a `LET` statement with a subquery to group the traversals by their `startCity` efficiently:
{% aqlexample examplevar="examplevar" type="type" query="query" bind="bind" result="result" %}
@startDocuBlockInline COMBINING_GRAPH_05_combine_let
@EXAMPLE_AQL{COMBINING_GRAPH_05_combine_let}
@DATASET{routeplanner}
FOR startCity IN germanCity
FILTER GEO_DISTANCE(@bonn, startCity.geometry) < @radius
LET oneCity = (
FOR v, e, p IN 1..1 OUTBOUND startCity
GRAPH 'routeplanner' RETURN v._key
)
RETURN {startCity: startCity._key, connectedCities: oneCity}
@BV {
bonn: [7.0998, 50.7340],
radius: 400000
}
@END_EXAMPLE_AQL
@endDocuBlock COMBINING_GRAPH_05_combine_let
{% endaqlexample %}
{% include aqlexample.html id=examplevar query=query bind=bind result=result %}
Finally, we clean up again:
{% arangoshexample examplevar="examplevar" script="script" result="result" %}
@startDocuBlockInline COMBINING_GRAPH_06_cleanup
@EXAMPLE_ARANGOSH_OUTPUT{COMBINING_GRAPH_06_cleanup}
~var examples = require("@arangodb/graph-examples/example-graph.js");
~var g = examples.loadGraph("routeplanner");
examples.dropGraph("routeplanner");
@END_EXAMPLE_ARANGOSH_OUTPUT
@endDocuBlock COMBINING_GRAPH_06_cleanup
{% endarangoshexample %}
{% include arangoshexample.html id=examplevar script=script result=result %}