mirror of https://gitee.com/bigwinds/arangodb
110 lines
4.8 KiB
Markdown
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:
|
|
|
|

|
|
{% 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 %} |