1
0
Fork 0

Doc - Fix/improve graph traversal/background indexing pages, console history and examples/options (#8378)

This commit is contained in:
Simran 2019-03-13 08:44:09 +01:00 committed by GitHub
parent b5f914f9ef
commit 9d466d3b06
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
30 changed files with 334 additions and 240 deletions

View File

@ -188,7 +188,7 @@ Needs at least two longitude/latitude pairs.
@startDocuBlockInline aqlGeoLineString_1 @startDocuBlockInline aqlGeoLineString_1
@EXAMPLE_AQL{aqlGeoLineString_1} @EXAMPLE_AQL{aqlGeoLineString_1}
RETURN GEO_LINESTRING([ RETURN GEO_LINESTRING([
[35, 10], [45, 45] [35, 10], [45, 45]
]) ])
@END_EXAMPLE_AQL @END_EXAMPLE_AQL
@endDocuBlock aqlGeoLineString_1 @endDocuBlock aqlGeoLineString_1
@ -206,8 +206,8 @@ Needs at least two elements consisting valid LineStrings coordinate arrays.
@startDocuBlockInline aqlGeoMultiLineString_1 @startDocuBlockInline aqlGeoMultiLineString_1
@EXAMPLE_AQL{aqlGeoMultiLineString_1} @EXAMPLE_AQL{aqlGeoMultiLineString_1}
RETURN GEO_MULTILINESTRING([ RETURN GEO_MULTILINESTRING([
[[100.0, 0.0], [101.0, 1.0]], [[100.0, 0.0], [101.0, 1.0]],
[[102.0, 2.0], [101.0, 2.3]] [[102.0, 2.0], [101.0, 2.3]]
]) ])
@END_EXAMPLE_AQL @END_EXAMPLE_AQL
@endDocuBlock aqlGeoMultiLineString_1 @endDocuBlock aqlGeoMultiLineString_1
@ -224,7 +224,7 @@ Construct a GeoJSON LineString. Needs at least two longitude/latitude pairs.
@startDocuBlockInline aqlGeoMultiPoint_1 @startDocuBlockInline aqlGeoMultiPoint_1
@EXAMPLE_AQL{aqlGeoMultiPoint_1} @EXAMPLE_AQL{aqlGeoMultiPoint_1}
RETURN GEO_MULTIPOINT([ RETURN GEO_MULTIPOINT([
[35, 10], [45, 45] [35, 10], [45, 45]
]) ])
@END_EXAMPLE_AQL @END_EXAMPLE_AQL
@endDocuBlock aqlGeoMultiPoint_1 @endDocuBlock aqlGeoMultiPoint_1
@ -262,7 +262,7 @@ Simple Polygon:
@startDocuBlockInline aqlGeoPolygon_1 @startDocuBlockInline aqlGeoPolygon_1
@EXAMPLE_AQL{aqlGeoPolygon_1} @EXAMPLE_AQL{aqlGeoPolygon_1}
RETURN GEO_POLYGON([ RETURN GEO_POLYGON([
[0.0, 0.0], [7.5, 2.5], [0.0, 5.0] [0.0, 0.0], [7.5, 2.5], [0.0, 5.0]
]) ])
@END_EXAMPLE_AQL @END_EXAMPLE_AQL
@endDocuBlock aqlGeoPolygon_1 @endDocuBlock aqlGeoPolygon_1
@ -272,8 +272,8 @@ Advanced Polygon with a hole inside:
@startDocuBlockInline aqlGeoPolygon_2 @startDocuBlockInline aqlGeoPolygon_2
@EXAMPLE_AQL{aqlGeoPolygon_2} @EXAMPLE_AQL{aqlGeoPolygon_2}
RETURN GEO_POLYGON([ RETURN GEO_POLYGON([
[[35, 10], [45, 45], [15, 40], [10, 20], [35, 10]], [[35, 10], [45, 45], [15, 40], [10, 20], [35, 10]],
[[20, 30], [35, 35], [30, 20], [20, 30]] [[20, 30], [35, 35], [30, 20], [20, 30]]
]) ])
@END_EXAMPLE_AQL @END_EXAMPLE_AQL
@endDocuBlock aqlGeoPolygon_2 @endDocuBlock aqlGeoPolygon_2
@ -293,13 +293,13 @@ MultiPolygon comprised of a simple Polygon and a Polygon with hole:
@startDocuBlockInline aqlGeoMultiPolygon_1 @startDocuBlockInline aqlGeoMultiPolygon_1
@EXAMPLE_AQL{aqlGeoMultiPolygon_1} @EXAMPLE_AQL{aqlGeoMultiPolygon_1}
RETURN GEO_MULTIPOLYGON([ RETURN GEO_MULTIPOLYGON([
[ [
[[40, 40], [20, 45], [45, 30], [40, 40]] [[40, 40], [20, 45], [45, 30], [40, 40]]
], ],
[ [
[[20, 35], [10, 30], [10, 10], [30, 5], [45, 20], [20, 35]], [[20, 35], [10, 30], [10, 10], [30, 5], [45, 20], [20, 35]],
[[30, 20], [20, 15], [20, 25], [30, 20]] [[30, 20], [20, 15], [20, 25], [30, 20]]
] ]
]) ])
@END_EXAMPLE_AQL @END_EXAMPLE_AQL
@endDocuBlock aqlGeoMultiPolygon_1 @endDocuBlock aqlGeoMultiPolygon_1

View File

@ -57,7 +57,7 @@ FOR vertex[, edge[, path]]
the search will not continue from this path, namely there will be no the search will not continue from this path, namely there will be no
result having this path as a prefix. result having this path as a prefix.
e.g.: Take the path: `(A) -> (B) -> (C)` starting at `A` and PRUNE on `B` e.g.: Take the path: `(A) -> (B) -> (C)` starting at `A` and PRUNE on `B`
will result in `(A)` and `(A) -> (B)` beeing valid paths, and `(A) -> (B) -> (C)` will result in `(A)` and `(A) -> (B)` being valid paths, and `(A) -> (B) -> (C)`
not returned, it got pruned on B. not returned, it got pruned on B.
* If the condition evaluates to `false` we will continue our search beyond * If the condition evaluates to `false` we will continue our search beyond
this path. this path.
@ -67,6 +67,12 @@ FOR vertex[, edge[, path]]
as well as all variables defined before this Traversal statement. as well as all variables defined before this Traversal statement.
- `OPTIONS` **options** (object, *optional*): used to modify the execution of the - `OPTIONS` **options** (object, *optional*): used to modify the execution of the
traversal. Only the following attributes have an effect, all others are ignored: traversal. Only the following attributes have an effect, all others are ignored:
- **bfs** (bool): optionally use the alternative breadth-first traversal algorithm
- true the traversal will be executed breadth-first. The results will first
contain all vertices at depth 1. Than all vertices at depth 2 and so on.
- false (default) the traversal will be executed depth-first. It will first
return all paths from *min* depth to *max* depth for one vertex at depth 1.
Than for the next vertex at depth 1 and so on.
- **uniqueVertices** (string): optionally ensure vertex uniqueness - **uniqueVertices** (string): optionally ensure vertex uniqueness
- "path" it is guaranteed that there is no path returned with a duplicate vertex - "path" it is guaranteed that there is no path returned with a duplicate vertex
- "global" it is guaranteed that each vertex is visited at most once during - "global" it is guaranteed that each vertex is visited at most once during
@ -75,18 +81,14 @@ FOR vertex[, edge[, path]]
might not be returned at all (it still might be part of a path). **Note:** might not be returned at all (it still might be part of a path). **Note:**
Using this configuration the result is not deterministic any more. If there Using this configuration the result is not deterministic any more. If there
are multiple paths from *startVertex* to *vertex*, one of those is picked. are multiple paths from *startVertex* to *vertex*, one of those is picked.
It is required to set `bfs: true` because with depth-first search the results
would be unpredictable.
- "none" (default) no uniqueness check is applied on vertices - "none" (default) no uniqueness check is applied on vertices
- **uniqueEdges** (string): optionally ensure edge uniqueness - **uniqueEdges** (string): optionally ensure edge uniqueness
- "path" (default) it is guaranteed that there is no path returned with a - "path" (default) it is guaranteed that there is no path returned with a
duplicate edge duplicate edge
- "none" no uniqueness check is applied on edges. **Note:** - "none" no uniqueness check is applied on edges. **Note:**
Using this configuration the traversal will follow cycles in edges. Using this configuration the traversal will follow edges in cycles.
- **bfs** (bool): optionally use the alternative breadth-first traversal algorithm
- true the traversal will be executed breadth-first. The results will first
contain all vertices at depth 1. Than all vertices at depth 2 and so on.
- false (default) the traversal will be executed depth-first. It will first
return all paths from *min* depth to *max* depth for one vertex at depth 1.
Than for the next vertex at depth 1 and so on.
### Working with collection sets ### Working with collection sets
@ -156,7 +158,9 @@ combined filters cannot.
The following examples are based on the [traversal graph](../../Manual/Graphs/index.html#the-traversal-graph). The following examples are based on the [traversal graph](../../Manual/Graphs/index.html#the-traversal-graph).
### Pruning (since version 3.4.5) ### Pruning
<small>Introduced in: v3.4.5</small>
Pruning is the easiest variant to formulate conditions to reduce the amount of data Pruning is the easiest variant to formulate conditions to reduce the amount of data
to be checked during a search. So it allows to improve query performance and reduces to be checked during a search. So it allows to improve query performance and reduces
@ -165,46 +169,46 @@ vertex, the edge and the path and any variable defined before.
See examples: See examples:
@startDocuBlockInline GRAPHTRAV_graphPruneEdges @startDocuBlockInline GRAPHTRAV_graphPruneEdges
@EXAMPLE_AQL{GRAPHTRAV_graphFilterEdges} @EXAMPLE_AQL{GRAPHTRAV_graphPruneEdges}
@DATASET{traversalGraph} @DATASET{traversalGraph}
FOR v, e, p IN 1..5 OUTBOUND 'circles/A' GRAPH 'traversalGraph' FOR v, e, p IN 1..5 OUTBOUND 'circles/A' GRAPH 'traversalGraph'
PRUNE e.theTruth == true PRUNE e.theTruth == true
RETURN { vertices: p.vertices[*]._key, edges: p.edges[*].label } RETURN { vertices: p.vertices[*]._key, edges: p.edges[*].label }
@END_EXAMPLE_AQL @END_EXAMPLE_AQL
@endDocuBlock GRAPHTRAV_graphPruneEdges @endDocuBlock GRAPHTRAV_graphPruneEdges
This will search until it sees an edge having `theTruth == true`. This will search until it sees an edge having `theTruth == true`.
The path with this edge will be returned, the search will not The path with this edge will be returned, the search will not
continue after this edge. continue after this edge.
Namely all responses either have no edge with `theTruth == true` Namely all responses either have no edge with `theTruth == true`
or the last edge on the path has `theTruth == true`. or the last edge on the path has `theTruth == true`.
@startDocuBlockInline GRAPHTRAV_graphPruneVertices @startDocuBlockInline GRAPHTRAV_graphPruneVertices
@EXAMPLE_AQL{GRAPHTRAV_graphFilterEdges} @EXAMPLE_AQL{GRAPHTRAV_graphPruneVertices}
@DATASET{traversalGraph} @DATASET{traversalGraph}
FOR v, e, p IN 1..5 OUTBOUND 'circles/A' GRAPH 'traversalGraph' FOR v, e, p IN 1..5 OUTBOUND 'circles/A' GRAPH 'traversalGraph'
PRUNE v._key == 'G' PRUNE v._key == 'G'
FILTER v._key == 'G' FILTER v._key == 'G'
RETURN { vertices: p.vertices[*]._key, edges: p.edges[*].label } RETURN { vertices: p.vertices[*]._key, edges: p.edges[*].label }
@END_EXAMPLE_AQL @END_EXAMPLE_AQL
@endDocuBlock GRAPHTRAV_graphPruneVertices @endDocuBlock GRAPHTRAV_graphPruneVertices
This will search for all paths from the source `circles/A` to the vertex `circles/G`. This will search for all paths from the source `circles/A` to the vertex `circles/G`.
This is done with first the PRUNE which makes sure we stop search as soon as we have found This is done with first the PRUNE which makes sure we stop search as soon as we have found
`G` and we will not go beyond `G` and via a loop return to it. `G` and we will not go beyond `G` and via a loop return to it.
With the second filter, we remove all paths that do not end in `G` namely With the second filter, we remove all paths that do not end in `G` namely
all shorter ones that have not been cut out by prune. all shorter ones that have not been cut out by prune.
Hence the list of all paths from `A` to `G` are returned. Hence the list of all paths from `A` to `G` are returned.
Note you can also prune as soon as you reach a certain collection with the following Note you can also prune as soon as you reach a certain collection with the following
example: example:
@startDocuBlockInline GRAPHTRAV_graphPruneCollection @startDocuBlockInline GRAPHTRAV_graphPruneCollection
@EXAMPLE_AQL{GRAPHTRAV_graphFilterEdges} @EXAMPLE_AQL{GRAPHTRAV_graphPruneCollection}
@DATASET{traversalGraph} @DATASET{traversalGraph}
FOR v, e, p IN 1..5 OUTBOUND 'circles/A' GRAPH 'traversalGraph' FOR v, e, p IN 1..5 OUTBOUND 'circles/A' GRAPH 'traversalGraph'
PRUNE IS_SAME_COLLECTION('circles', v) PRUNE IS_SAME_COLLECTION('circles', v)
RETURN { vertices: p.vertices[*]._key, edges: p.edges[*].label } RETURN { vertices: p.vertices[*]._key, edges: p.edges[*].label }
@END_EXAMPLE_AQL @END_EXAMPLE_AQL
@endDocuBlock GRAPHTRAV_graphPruneCollection @endDocuBlock GRAPHTRAV_graphPruneCollection
@ -223,8 +227,8 @@ or relative positions to the end of the path by specifying a negative number.
@EXAMPLE_AQL{GRAPHTRAV_graphFilterEdges} @EXAMPLE_AQL{GRAPHTRAV_graphFilterEdges}
@DATASET{traversalGraph} @DATASET{traversalGraph}
FOR v, e, p IN 1..5 OUTBOUND 'circles/A' GRAPH 'traversalGraph' FOR v, e, p IN 1..5 OUTBOUND 'circles/A' GRAPH 'traversalGraph'
FILTER p.edges[0].theTruth == true FILTER p.edges[0].theTruth == true
RETURN { vertices: p.vertices[*]._key, edges: p.edges[*].label } RETURN { vertices: p.vertices[*]._key, edges: p.edges[*].label }
@END_EXAMPLE_AQL @END_EXAMPLE_AQL
@endDocuBlock GRAPHTRAV_graphFilterEdges @endDocuBlock GRAPHTRAV_graphFilterEdges
@ -240,8 +244,8 @@ Similar to filtering the edges on the path you can also filter the vertices:
@EXAMPLE_AQL{GRAPHTRAV_graphFilterVertices} @EXAMPLE_AQL{GRAPHTRAV_graphFilterVertices}
@DATASET{traversalGraph} @DATASET{traversalGraph}
FOR v, e, p IN 1..5 OUTBOUND 'circles/A' GRAPH 'traversalGraph' FOR v, e, p IN 1..5 OUTBOUND 'circles/A' GRAPH 'traversalGraph'
FILTER p.vertices[1]._key == "G" FILTER p.vertices[1]._key == "G"
RETURN { vertices: p.vertices[*]._key, edges: p.edges[*].label } RETURN { vertices: p.vertices[*]._key, edges: p.edges[*].label }
@END_EXAMPLE_AQL @END_EXAMPLE_AQL
@endDocuBlock GRAPHTRAV_graphFilterVertices @endDocuBlock GRAPHTRAV_graphFilterVertices
@ -253,10 +257,10 @@ And of course you can combine these filters in any way you like:
@EXAMPLE_AQL{GRAPHTRAV_graphFilterCombine} @EXAMPLE_AQL{GRAPHTRAV_graphFilterCombine}
@DATASET{traversalGraph} @DATASET{traversalGraph}
FOR v, e, p IN 1..5 OUTBOUND 'circles/A' GRAPH 'traversalGraph' FOR v, e, p IN 1..5 OUTBOUND 'circles/A' GRAPH 'traversalGraph'
FILTER p.edges[0].theTruth == true FILTER p.edges[0].theTruth == true
AND p.edges[1].theFalse == false AND p.edges[1].theFalse == false
FILTER p.vertices[1]._key == "G" FILTER p.vertices[1]._key == "G"
RETURN { vertices: p.vertices[*]._key, edges: p.edges[*].label } RETURN { vertices: p.vertices[*]._key, edges: p.edges[*].label }
@END_EXAMPLE_AQL @END_EXAMPLE_AQL
@endDocuBlock GRAPHTRAV_graphFilterCombine @endDocuBlock GRAPHTRAV_graphFilterCombine
@ -278,8 +282,8 @@ on the entire path, like ALL edges should have theTruth == true:
@EXAMPLE_AQL{GRAPHTRAV_graphFilterEntirePath} @EXAMPLE_AQL{GRAPHTRAV_graphFilterEntirePath}
@DATASET{traversalGraph} @DATASET{traversalGraph}
FOR v, e, p IN 1..5 OUTBOUND 'circles/A' GRAPH 'traversalGraph' FOR v, e, p IN 1..5 OUTBOUND 'circles/A' GRAPH 'traversalGraph'
FILTER p.edges[*].theTruth ALL == true FILTER p.edges[*].theTruth ALL == true
RETURN { vertices: p.vertices[*]._key, edges: p.edges[*].label } RETURN { vertices: p.vertices[*]._key, edges: p.edges[*].label }
@END_EXAMPLE_AQL @END_EXAMPLE_AQL
@endDocuBlock GRAPHTRAV_graphFilterEntirePath @endDocuBlock GRAPHTRAV_graphFilterEntirePath
@ -289,8 +293,8 @@ Or NONE of the edges should have theTruth == true:
@EXAMPLE_AQL{GRAPHTRAV_graphFilterPathEdges} @EXAMPLE_AQL{GRAPHTRAV_graphFilterPathEdges}
@DATASET{traversalGraph} @DATASET{traversalGraph}
FOR v, e, p IN 1..5 OUTBOUND 'circles/A' GRAPH 'traversalGraph' FOR v, e, p IN 1..5 OUTBOUND 'circles/A' GRAPH 'traversalGraph'
FILTER p.edges[*].theTruth NONE == true FILTER p.edges[*].theTruth NONE == true
RETURN { vertices: p.vertices[*]._key, edges: p.edges[*].label } RETURN { vertices: p.vertices[*]._key, edges: p.edges[*].label }
@END_EXAMPLE_AQL @END_EXAMPLE_AQL
@endDocuBlock GRAPHTRAV_graphFilterPathEdges @endDocuBlock GRAPHTRAV_graphFilterPathEdges
@ -303,8 +307,8 @@ It is also possible to define that at least one edge on the path has to fulfill
@EXAMPLE_AQL{GRAPHTRAV_graphFilterPathAnyEdge} @EXAMPLE_AQL{GRAPHTRAV_graphFilterPathAnyEdge}
@DATASET{traversalGraph} @DATASET{traversalGraph}
FOR v, e, p IN 1..5 OUTBOUND 'circles/A' GRAPH 'traversalGraph' FOR v, e, p IN 1..5 OUTBOUND 'circles/A' GRAPH 'traversalGraph'
FILTER p.edges[*].theTruth ANY == true FILTER p.edges[*].theTruth ANY == true
RETURN { vertices: p.vertices[*]._key, edges: p.edges[*].label } RETURN { vertices: p.vertices[*]._key, edges: p.edges[*].label }
@END_EXAMPLE_AQL @END_EXAMPLE_AQL
@endDocuBlock GRAPHTRAV_graphFilterPathAnyEdge @endDocuBlock GRAPHTRAV_graphFilterPathAnyEdge
@ -315,7 +319,7 @@ All of the above filters can be defined on vertices in the exact same way.
Filtering on the path influences the Iteration on your graph. If certain conditions Filtering on the path influences the Iteration on your graph. If certain conditions
aren't met, the traversal may stop continuing along this path. aren't met, the traversal may stop continuing along this path.
In contrast filters on vertex or edge only express whether you're interestet in the actual value of these In contrast filters on vertex or edge only express whether you're interested in the actual value of these
documents. Thus, it influences the list of returned documents (if you return v or e) similar documents. Thus, it influences the list of returned documents (if you return v or e) similar
as specifying a non-null `min` value. If you specify a min value of 2, the traversal over the first as specifying a non-null `min` value. If you specify a min value of 2, the traversal over the first
two nodes of these paths has to be executed - you just won't see them in your result array. two nodes of these paths has to be executed - you just won't see them in your result array.
@ -323,7 +327,6 @@ two nodes of these paths has to be executed - you just won't see them in your re
Similar are filters on vertices or edges - the traverser has to walk along these nodes, since Similar are filters on vertices or edges - the traverser has to walk along these nodes, since
you may be interested in documents further down the path. you may be interested in documents further down the path.
### Examples ### Examples
We will create a simple symmetric traversal demonstration graph: We will create a simple symmetric traversal demonstration graph:
@ -399,14 +402,18 @@ side of the graph, we may filter in two ways:
@startDocuBlockInline GRAPHTRAV_04_traverse_4a @startDocuBlockInline GRAPHTRAV_04_traverse_4a
@EXAMPLE_AQL{GRAPHTRAV_04_traverse_4a} @EXAMPLE_AQL{GRAPHTRAV_04_traverse_4a}
@DATASET{traversalGraph} @DATASET{traversalGraph}
FOR v, e, p IN 1..3 OUTBOUND 'circles/A' GRAPH 'traversalGraph' FILTER p.vertices[1]._key != 'G' RETURN v._key FOR v, e, p IN 1..3 OUTBOUND 'circles/A' GRAPH 'traversalGraph'
FILTER p.vertices[1]._key != 'G'
RETURN v._key
@END_EXAMPLE_AQL @END_EXAMPLE_AQL
@endDocuBlock GRAPHTRAV_04_traverse_4a @endDocuBlock GRAPHTRAV_04_traverse_4a
@startDocuBlockInline GRAPHTRAV_04_traverse_4b @startDocuBlockInline GRAPHTRAV_04_traverse_4b
@EXAMPLE_AQL{GRAPHTRAV_04_traverse_4b} @EXAMPLE_AQL{GRAPHTRAV_04_traverse_4b}
@DATASET{traversalGraph} @DATASET{traversalGraph}
FOR v, e, p IN 1..3 OUTBOUND 'circles/A' GRAPH 'traversalGraph' FILTER p.edges[0].label != 'right_foo' RETURN v._key FOR v, e, p IN 1..3 OUTBOUND 'circles/A' GRAPH 'traversalGraph'
FILTER p.edges[0].label != 'right_foo'
RETURN v._key
@END_EXAMPLE_AQL @END_EXAMPLE_AQL
@endDocuBlock GRAPHTRAV_04_traverse_4b @endDocuBlock GRAPHTRAV_04_traverse_4b
@ -422,8 +429,8 @@ We also may combine several filters, for instance to filter out the right branch
@EXAMPLE_AQL{GRAPHTRAV_05_traverse_5a} @EXAMPLE_AQL{GRAPHTRAV_05_traverse_5a}
@DATASET{traversalGraph} @DATASET{traversalGraph}
FOR v,e,p IN 1..3 OUTBOUND 'circles/A' GRAPH 'traversalGraph' FOR v,e,p IN 1..3 OUTBOUND 'circles/A' GRAPH 'traversalGraph'
FILTER p.vertices[1]._key != 'G' FILTER p.vertices[1]._key != 'G'
FILTER p.edges[1].label != 'left_blub' FILTER p.edges[1].label != 'left_blub'
RETURN v._key RETURN v._key
@END_EXAMPLE_AQL @END_EXAMPLE_AQL
@endDocuBlock GRAPHTRAV_05_traverse_5a @endDocuBlock GRAPHTRAV_05_traverse_5a
@ -432,7 +439,7 @@ We also may combine several filters, for instance to filter out the right branch
@EXAMPLE_AQL{GRAPHTRAV_05_traverse_5b} @EXAMPLE_AQL{GRAPHTRAV_05_traverse_5b}
@DATASET{traversalGraph} @DATASET{traversalGraph}
FOR v,e,p IN 1..3 OUTBOUND 'circles/A' GRAPH 'traversalGraph' FOR v,e,p IN 1..3 OUTBOUND 'circles/A' GRAPH 'traversalGraph'
FILTER p.vertices[1]._key != 'G' AND p.edges[1].label != 'left_blub' FILTER p.vertices[1]._key != 'G' AND p.edges[1].label != 'left_blub'
RETURN v._key RETURN v._key
@END_EXAMPLE_AQL @END_EXAMPLE_AQL
@endDocuBlock GRAPHTRAV_05_traverse_5b @endDocuBlock GRAPHTRAV_05_traverse_5b
@ -451,7 +458,7 @@ from `circles/E`:
@EXAMPLE_AQL{GRAPHTRAV_06_traverse_6a} @EXAMPLE_AQL{GRAPHTRAV_06_traverse_6a}
@DATASET{traversalGraph} @DATASET{traversalGraph}
FOR v IN 1..3 OUTBOUND 'circles/E' GRAPH 'traversalGraph' FOR v IN 1..3 OUTBOUND 'circles/E' GRAPH 'traversalGraph'
RETURN v._key RETURN v._key
@END_EXAMPLE_AQL @END_EXAMPLE_AQL
@endDocuBlock GRAPHTRAV_06_traverse_6a @endDocuBlock GRAPHTRAV_06_traverse_6a
@ -459,7 +466,7 @@ from `circles/E`:
@EXAMPLE_AQL{GRAPHTRAV_06_traverse_6b} @EXAMPLE_AQL{GRAPHTRAV_06_traverse_6b}
@DATASET{traversalGraph} @DATASET{traversalGraph}
FOR v IN 1..3 INBOUND 'circles/E' GRAPH 'traversalGraph' FOR v IN 1..3 INBOUND 'circles/E' GRAPH 'traversalGraph'
RETURN v._key RETURN v._key
@END_EXAMPLE_AQL @END_EXAMPLE_AQL
@endDocuBlock GRAPHTRAV_06_traverse_6b @endDocuBlock GRAPHTRAV_06_traverse_6b
@ -467,7 +474,7 @@ from `circles/E`:
@EXAMPLE_AQL{GRAPHTRAV_06_traverse_6c} @EXAMPLE_AQL{GRAPHTRAV_06_traverse_6c}
@DATASET{traversalGraph} @DATASET{traversalGraph}
FOR v IN 1..3 ANY 'circles/E' GRAPH 'traversalGraph' FOR v IN 1..3 ANY 'circles/E' GRAPH 'traversalGraph'
RETURN v._key RETURN v._key
@END_EXAMPLE_AQL @END_EXAMPLE_AQL
@endDocuBlock GRAPHTRAV_06_traverse_6c @endDocuBlock GRAPHTRAV_06_traverse_6c
@ -496,20 +503,19 @@ traversal queries using [the explainer](../ExecutionAndPerformance/Optimizer.md)
@DATASET{traversalGraph} @DATASET{traversalGraph}
@EXPLAIN{TRUE} @EXPLAIN{TRUE}
FOR v,e,p IN 1..3 OUTBOUND 'circles/A' GRAPH 'traversalGraph' FOR v,e,p IN 1..3 OUTBOUND 'circles/A' GRAPH 'traversalGraph'
LET localScopeVar = RAND() > 0.5 LET localScopeVar = RAND() > 0.5
FILTER p.edges[0].theTruth != localScopeVar FILTER p.edges[0].theTruth != localScopeVar
RETURN v._key RETURN v._key
@END_EXAMPLE_AQL @END_EXAMPLE_AQL
@endDocuBlock GRAPHTRAV_07_traverse_7 @endDocuBlock GRAPHTRAV_07_traverse_7
@startDocuBlockInline GRAPHTRAV_07_traverse_8 @startDocuBlockInline GRAPHTRAV_07_traverse_8
@EXAMPLE_AQL{GRAPHTRAV_07_traverse_8} @EXAMPLE_AQL{GRAPHTRAV_07_traverse_8}
@DATASET{traversalGraph} @DATASET{traversalGraph}
@EXPLAIN{TRUE} @EXPLAIN{TRUE}
FOR v,e,p IN 1..3 OUTBOUND 'circles/A' GRAPH 'traversalGraph' FOR v,e,p IN 1..3 OUTBOUND 'circles/A' GRAPH 'traversalGraph'
FILTER p.edges[0].label == 'right_foo' FILTER p.edges[0].label == 'right_foo'
RETURN v._key RETURN v._key
@END_EXAMPLE_AQL @END_EXAMPLE_AQL
@endDocuBlock GRAPHTRAV_07_traverse_8 @endDocuBlock GRAPHTRAV_07_traverse_8
@ -530,7 +536,6 @@ And finally clean it up again:
@END_EXAMPLE_ARANGOSH_OUTPUT @END_EXAMPLE_ARANGOSH_OUTPUT
@endDocuBlock GRAPHTRAV_99_drop_graph @endDocuBlock GRAPHTRAV_99_drop_graph
If this traversal is not powerful enough for your needs, like you cannot describe If this traversal is not powerful enough for your needs, like you cannot describe
your conditions as AQL filter statements, then you might want to have a look at your conditions as AQL filter statements, then you might want to have a look at
[manually crafted traversers](../../Manual/Graphs/Traversals/index.html). [manually crafted traversers](../../Manual/Graphs/Traversals/index.html).

View File

@ -9,9 +9,9 @@ There are special sections for
- [Index Utilization](IndexUtilization.md): How ArangoDB uses indexes - [Index Utilization](IndexUtilization.md): How ArangoDB uses indexes
- [Working with Indexes](WorkingWithIndexes.md): How to handle indexes - [Working with Indexes](WorkingWithIndexes.md): How to handle indexes
programmatically using the `db` object programmatically using the `db` object
- [Hash Indexes](Hash.md) - [Hash Indexes](Hash.md)
- [Skiplists](Skiplist.md) - [Skiplists](Skiplist.md)
- [Persistent Indexes](Persistent.md) - [Persistent Indexes](Persistent.md)
- [Fulltext Indexes](Fulltext.md) - [Fulltext Indexes](Fulltext.md)
- [Geo-spatial Indexes](Geo.md) - [Geo-spatial Indexes](Geo.md)
- [Vertex-centric Indexes](VertexCentric.md) - [Vertex-centric Indexes](VertexCentric.md)

View File

@ -5,88 +5,98 @@ arangosh&gt; db.circles.toArray();
{ {
"_key" : "I", "_key" : "I",
"_id" : "circles/I", "_id" : "circles/I",
"_rev" : "_YQtDXP---F", "_rev" : "_YT2FO_e--_",
"label" : "9" "label" : "9"
}, },
{ {
"_key" : "G", "_key" : "G",
"_id" : "circles/G", "_id" : "circles/G",
"_rev" : "_YQtDXP---B", "_rev" : "_YT2FO_a--B",
"label" : "7" "label" : "7"
}, },
{ {
"_key" : "F", "_key" : "F",
"_id" : "circles/F", "_id" : "circles/F",
"_rev" : "_YQtDXP---_", "_rev" : "_YT2FO_a--_",
"label" : "6" "label" : "6"
}, },
{ {
"_key" : "A", "_key" : "A",
"_id" : "circles/A", "_id" : "circles/A",
"_rev" : "_YQtDXO2--_", "_rev" : "_YT2FO_S--_",
"label" : "1" "label" : "1"
}, },
{ {
"_key" : "E", "_key" : "E",
"_id" : "circles/E", "_id" : "circles/E",
"_rev" : "_YQtDXO6--F", "_rev" : "_YT2FO_W--B",
"label" : "5" "label" : "5"
}, },
{ {
"_key" : "C", "_key" : "C",
"_id" : "circles/C", "_id" : "circles/C",
"_rev" : "_YQtDXO6--B", "_rev" : "_YT2FO_S--D",
"label" : "3" "label" : "3"
}, },
{ {
"_key" : "D", "_key" : "D",
"_id" : "circles/D", "_id" : "circles/D",
"_rev" : "_YQtDXO6--D", "_rev" : "_YT2FO_W--_",
"label" : "4" "label" : "4"
}, },
{ {
"_key" : "J", "_key" : "J",
"_id" : "circles/J", "_id" : "circles/J",
"_rev" : "_YQtDXPC--_", "_rev" : "_YT2FO_e--B",
"label" : "10" "label" : "10"
}, },
{ {
"_key" : "B", "_key" : "B",
"_id" : "circles/B", "_id" : "circles/B",
"_rev" : "_YQtDXO6--_", "_rev" : "_YT2FO_S--B",
"label" : "2" "label" : "2"
}, },
{ {
"_key" : "H", "_key" : "H",
"_id" : "circles/H", "_id" : "circles/H",
"_rev" : "_YQtDXP---D", "_rev" : "_YT2FO_a--D",
"label" : "8" "label" : "8"
}, },
{ {
"_key" : "K", "_key" : "K",
"_id" : "circles/K", "_id" : "circles/K",
"_rev" : "_YQtDXPC--B", "_rev" : "_YT2FO_e--D",
"label" : "11" "label" : "11"
} }
] ]
arangosh&gt; db.edges.toArray(); arangosh&gt; db.edges.toArray();
[ [
{ {
"_key" : "98581", "_key" : "98575",
"_id" : "edges/98581", "_id" : "edges/98575",
"_from" : "circles/B", "_from" : "circles/B",
"_to" : "circles/C", "_to" : "circles/C",
"_rev" : "_YQtDXPC--F", "_rev" : "_YT2FO_i--B",
"theFalse" : false, "theFalse" : false,
"theTruth" : true, "theTruth" : true,
"label" : "left_blarg" "label" : "left_blarg"
}, },
{
"_key" : "98581",
"_id" : "edges/98581",
"_from" : "circles/B",
"_to" : "circles/E",
"_rev" : "_YT2FO_m--B",
"theFalse" : false,
"theTruth" : true,
"label" : "left_blub"
},
{ {
"_key" : "98584", "_key" : "98584",
"_id" : "edges/98584", "_id" : "edges/98584",
"_from" : "circles/C", "_from" : "circles/E",
"_to" : "circles/D", "_to" : "circles/F",
"_rev" : "_YQtDXPG--_", "_rev" : "_YT2FO_m--D",
"theFalse" : false, "theFalse" : false,
"theTruth" : true, "theTruth" : true,
"label" : "left_blorg" "label" : "left_blorg"
@ -94,9 +104,9 @@ arangosh&gt; db.edges.toArray();
{ {
"_key" : "98599", "_key" : "98599",
"_id" : "edges/98599", "_id" : "edges/98599",
"_from" : "circles/H", "_from" : "circles/J",
"_to" : "circles/I", "_to" : "circles/K",
"_rev" : "_YQtDXPK--B", "_rev" : "_YT2FO_u--B",
"theFalse" : false, "theFalse" : false,
"theTruth" : true, "theTruth" : true,
"label" : "right_blub" "label" : "right_blub"
@ -105,18 +115,8 @@ arangosh&gt; db.edges.toArray();
"_key" : "98596", "_key" : "98596",
"_id" : "edges/98596", "_id" : "edges/98596",
"_from" : "circles/G", "_from" : "circles/G",
"_to" : "circles/H",
"_rev" : "_YQtDXPK--_",
"theFalse" : false,
"theTruth" : true,
"label" : "right_blob"
},
{
"_key" : "98602",
"_id" : "edges/98602",
"_from" : "circles/G",
"_to" : "circles/J", "_to" : "circles/J",
"_rev" : "_YQtDXPK--D", "_rev" : "_YT2FO_u--_",
"theFalse" : false, "theFalse" : false,
"theTruth" : true, "theTruth" : true,
"label" : "right_zip" "label" : "right_zip"
@ -124,52 +124,52 @@ arangosh&gt; db.edges.toArray();
{ {
"_key" : "98593", "_key" : "98593",
"_id" : "edges/98593", "_id" : "edges/98593",
"_from" : "circles/H",
"_to" : "circles/I",
"_rev" : "_YT2FO_q--D",
"theFalse" : false,
"theTruth" : true,
"label" : "right_zip"
},
{
"_key" : "98587",
"_id" : "edges/98587",
"_from" : "circles/A", "_from" : "circles/A",
"_to" : "circles/G", "_to" : "circles/G",
"_rev" : "_YQtDXPG--F", "_rev" : "_YT2FO_q--_",
"theFalse" : false, "theFalse" : false,
"theTruth" : true, "theTruth" : true,
"label" : "right_foo" "label" : "right_foo"
}, },
{ {
"_key" : "98605", "_key" : "98571",
"_id" : "edges/98605", "_id" : "edges/98571",
"_from" : "circles/J",
"_to" : "circles/K",
"_rev" : "_YQtDXPK--F",
"theFalse" : false,
"theTruth" : true,
"label" : "right_zup"
},
{
"_key" : "98587",
"_id" : "edges/98587",
"_from" : "circles/B",
"_to" : "circles/E",
"_rev" : "_YQtDXPG--B",
"theFalse" : false,
"theTruth" : true,
"label" : "left_blub"
},
{
"_key" : "98577",
"_id" : "edges/98577",
"_from" : "circles/A", "_from" : "circles/A",
"_to" : "circles/B", "_to" : "circles/B",
"_rev" : "_YQtDXPC--D", "_rev" : "_YT2FO_i--_",
"theFalse" : false, "theFalse" : false,
"theTruth" : true, "theTruth" : true,
"label" : "left_bar" "label" : "left_bar"
}, },
{ {
"_key" : "98590", "_key" : "98578",
"_id" : "edges/98590", "_id" : "edges/98578",
"_from" : "circles/E", "_from" : "circles/C",
"_to" : "circles/F", "_to" : "circles/D",
"_rev" : "_YQtDXPG--D", "_rev" : "_YT2FO_m--_",
"theFalse" : false, "theFalse" : false,
"theTruth" : true, "theTruth" : true,
"label" : "left_schubi" "label" : "left_blorg"
},
{
"_key" : "98590",
"_id" : "edges/98590",
"_from" : "circles/G",
"_to" : "circles/H",
"_rev" : "_YT2FO_q--B",
"theFalse" : false,
"theTruth" : true,
"label" : "right_blob"
} }
] ]
arangosh&gt; print("once you don't need them anymore, clean them up:"); arangosh&gt; print("once you don't need them anymore, clean them up:");

View File

@ -1,5 +1,7 @@
@Q: @Q:
FOR v, e, p IN <span class="hljs-number">1.</span><span class="hljs-number">.3</span> OUTBOUND <span class="hljs-string">'circles/A'</span> GRAPH <span class="hljs-string">'traversalGraph'</span> FILTER p.vertices[<span class="hljs-number">1</span>]._key != <span class="hljs-string">'G'</span> RETURN v._key FOR v, e, p IN <span class="hljs-number">1.</span><span class="hljs-number">.3</span> OUTBOUND <span class="hljs-string">'circles/A'</span> GRAPH <span class="hljs-string">'traversalGraph'</span>
FILTER p.vertices[<span class="hljs-number">1</span>]._key != <span class="hljs-string">'G'</span>
RETURN v._key
@R @R
[ [

View File

@ -1,5 +1,7 @@
@Q: @Q:
FOR v, e, p IN <span class="hljs-number">1.</span><span class="hljs-number">.3</span> OUTBOUND <span class="hljs-string">'circles/A'</span> GRAPH <span class="hljs-string">'traversalGraph'</span> FILTER p.edges[<span class="hljs-number">0</span>].label != <span class="hljs-string">'right_foo'</span> RETURN v._key FOR v, e, p IN <span class="hljs-number">1.</span><span class="hljs-number">.3</span> OUTBOUND <span class="hljs-string">'circles/A'</span> GRAPH <span class="hljs-string">'traversalGraph'</span>
FILTER p.edges[<span class="hljs-number">0</span>].label != <span class="hljs-string">'right_foo'</span>
RETURN v._key
@R @R
[ [

View File

@ -1,7 +1,7 @@
@Q: @Q:
FOR v,e,p IN <span class="hljs-number">1.</span><span class="hljs-number">.3</span> OUTBOUND <span class="hljs-string">'circles/A'</span> GRAPH <span class="hljs-string">'traversalGraph'</span> FOR v,e,p IN <span class="hljs-number">1.</span><span class="hljs-number">.3</span> OUTBOUND <span class="hljs-string">'circles/A'</span> GRAPH <span class="hljs-string">'traversalGraph'</span>
FILTER p.vertices[<span class="hljs-number">1</span>]._key != <span class="hljs-string">'G'</span> FILTER p.vertices[<span class="hljs-number">1</span>]._key != <span class="hljs-string">'G'</span>
FILTER p.edges[<span class="hljs-number">1</span>].label != <span class="hljs-string">'left_blub'</span> FILTER p.edges[<span class="hljs-number">1</span>].label != <span class="hljs-string">'left_blub'</span>
RETURN v._key RETURN v._key
@R @R

View File

@ -1,6 +1,6 @@
@Q: @Q:
FOR v,e,p IN <span class="hljs-number">1.</span><span class="hljs-number">.3</span> OUTBOUND <span class="hljs-string">'circles/A'</span> GRAPH <span class="hljs-string">'traversalGraph'</span> FOR v,e,p IN <span class="hljs-number">1.</span><span class="hljs-number">.3</span> OUTBOUND <span class="hljs-string">'circles/A'</span> GRAPH <span class="hljs-string">'traversalGraph'</span>
FILTER p.vertices[<span class="hljs-number">1</span>]._key != <span class="hljs-string">'G'</span> AND p.edges[<span class="hljs-number">1</span>].label != <span class="hljs-string">'left_blub'</span> FILTER p.vertices[<span class="hljs-number">1</span>]._key != <span class="hljs-string">'G'</span> AND p.edges[<span class="hljs-number">1</span>].label != <span class="hljs-string">'left_blub'</span>
RETURN v._key RETURN v._key
@R @R

View File

@ -1,6 +1,6 @@
@Q: @Q:
FOR v IN <span class="hljs-number">1.</span><span class="hljs-number">.3</span> OUTBOUND <span class="hljs-string">'circles/E'</span> GRAPH <span class="hljs-string">'traversalGraph'</span> FOR v IN <span class="hljs-number">1.</span><span class="hljs-number">.3</span> OUTBOUND <span class="hljs-string">'circles/E'</span> GRAPH <span class="hljs-string">'traversalGraph'</span>
RETURN v._key RETURN v._key
@R @R
[ [

View File

@ -1,6 +1,6 @@
@Q: @Q:
FOR v IN <span class="hljs-number">1.</span><span class="hljs-number">.3</span> INBOUND <span class="hljs-string">'circles/E'</span> GRAPH <span class="hljs-string">'traversalGraph'</span> FOR v IN <span class="hljs-number">1.</span><span class="hljs-number">.3</span> INBOUND <span class="hljs-string">'circles/E'</span> GRAPH <span class="hljs-string">'traversalGraph'</span>
RETURN v._key RETURN v._key
@R @R
[ [

View File

@ -1,6 +1,6 @@
@Q: @Q:
FOR v IN <span class="hljs-number">1.</span><span class="hljs-number">.3</span> ANY <span class="hljs-string">'circles/E'</span> GRAPH <span class="hljs-string">'traversalGraph'</span> FOR v IN <span class="hljs-number">1.</span><span class="hljs-number">.3</span> ANY <span class="hljs-string">'circles/E'</span> GRAPH <span class="hljs-string">'traversalGraph'</span>
RETURN v._key RETURN v._key
@R @R
[ [

View File

@ -1,42 +1,42 @@
@Q: @Q:
FOR v,e,p IN <span class="hljs-number">1.</span><span class="hljs-number">.3</span> OUTBOUND <span class="hljs-string">'circles/A'</span> GRAPH <span class="hljs-string">'traversalGraph'</span> FOR v,e,p IN <span class="hljs-number">1.</span><span class="hljs-number">.3</span> OUTBOUND <span class="hljs-string">'circles/A'</span> GRAPH <span class="hljs-string">'traversalGraph'</span>
LET localScopeVar = RAND() &gt; <span class="hljs-number">0.5</span> LET localScopeVar = RAND() &gt; <span class="hljs-number">0.5</span>
FILTER p.edges[<span class="hljs-number">0</span>].theTruth != localScopeVar FILTER p.edges[<span class="hljs-number">0</span>].theTruth != localScopeVar
RETURN v._key RETURN v._key
@R @R
<span style="color:rgb(85,85,255)">Query String:</span> Query String:
<span style="color:rgb(0,187,0)"> FOR v,e,p IN 1..3 OUTBOUND 'circles/A' GRAPH 'traversalGraph' FOR v,e,p IN 1..3 OUTBOUND 'circles/A' GRAPH 'traversalGraph'
LET localScopeVar = RAND() &gt; 0.5 LET localScopeVar = RAND() &gt; 0.5
FILTER p.edges[0].theTruth != localScopeVar FILTER p.edges[0].theTruth != localScopeVar
RETURN v._key RETURN v._key
</span>
<span style="color:rgb(85,85,255)">Execution plan:</span>
<span style="color:rgb(187,0,187)">Id</span> <span style="color:rgb(187,0,187)">NodeType</span> <span style="color:rgb(187,0,187)">Est.</span> <span style="color:rgb(187,0,187)">Comment</span>
<span style="color:rgb(187,187,0)">1</span> <span style="color:rgb(0,187,187)">SingletonNode</span> <span style="color:rgb(0,187,0)">1</span> * <span style="color:rgb(0,187,187)">ROOT</span>
<span style="color:rgb(187,187,0)">2</span> <span style="color:rgb(0,187,187)">TraversalNode</span> <span style="color:rgb(0,187,0)">1</span> - <span style="color:rgb(0,187,187)">FOR </span><span style="color:rgb(187,187,0)">v</span> <span style="color:rgb(0,0,187)">/* vertex */</span>, <span style="color:rgb(187,187,0)">p</span> <span style="color:rgb(0,0,187)">/* paths */</span> <span style="color:rgb(0,187,187)">IN</span> <span style="color:rgb(0,187,0)">1..3</span> <span style="color:rgb(0,0,187)">/* min..maxPathDepth */</span> <span style="color:rgb(0,187,187)">OUTBOUND</span> '<span style="color:rgb(0,187,0)">circles/A</span>' <span style="color:rgb(0,0,187)">/* startnode */</span> <span style="color:rgb(0,187,187)">GRAPH</span> '<span style="color:rgb(0,187,0)">traversalGraph</span>'
<span style="color:rgb(187,187,0)">3</span> <span style="color:rgb(0,187,187)">CalculationNode</span> <span style="color:rgb(0,187,0)">1</span> - <span style="color:rgb(0,187,187)">LET</span> <span style="color:rgb(187,187,0)">localScopeVar</span> = (<span style="color:rgb(0,187,0)">RAND</span>() &gt; <span style="color:rgb(0,187,0)">0.5</span>) <span style="color:rgb(0,0,187)">/* simple expression */</span>
<span style="color:rgb(187,187,0)">4</span> <span style="color:rgb(0,187,187)">CalculationNode</span> <span style="color:rgb(0,187,0)">1</span> - <span style="color:rgb(0,187,187)">LET</span> <span style="color:rgb(187,0,187)">#6</span> = (<span style="color:rgb(187,187,0)">p</span>.`<span style="color:rgb(187,187,0)">edges</span>`[<span style="color:rgb(0,187,0)">0</span>].`<span style="color:rgb(187,187,0)">theTruth</span>` != <span style="color:rgb(187,187,0)">localScopeVar</span>) <span style="color:rgb(0,0,187)">/* simple expression */</span>
<span style="color:rgb(187,187,0)">5</span> <span style="color:rgb(0,187,187)">FilterNode</span> <span style="color:rgb(0,187,0)">1</span> - <span style="color:rgb(0,187,187)">FILTER</span> <span style="color:rgb(187,0,187)">#6</span>
<span style="color:rgb(187,187,0)">6</span> <span style="color:rgb(0,187,187)">CalculationNode</span> <span style="color:rgb(0,187,0)">1</span> - <span style="color:rgb(0,187,187)">LET</span> <span style="color:rgb(187,0,187)">#8</span> = <span style="color:rgb(187,187,0)">v</span>.`<span style="color:rgb(187,187,0)">_key</span>` <span style="color:rgb(0,0,187)">/* attribute expression */</span>
<span style="color:rgb(187,187,0)">7</span> <span style="color:rgb(0,187,187)">ReturnNode</span> <span style="color:rgb(0,187,0)">1</span> - <span style="color:rgb(0,187,187)">RETURN</span> <span style="color:rgb(187,0,187)">#8</span>
<span style="color:rgb(85,85,255)">Indexes used:</span> Execution plan:
<span style="color:rgb(187,0,187)">By</span> <span style="color:rgb(187,0,187)">Type</span> <span style="color:rgb(187,0,187)">Collection</span> <span style="color:rgb(187,0,187)">Unique</span> <span style="color:rgb(187,0,187)">Sparse</span> <span style="color:rgb(187,0,187)">Selectivity</span> <span style="color:rgb(187,0,187)">Fields</span> <span style="color:rgb(187,0,187)">Ranges</span> Id NodeType Est. Comment
<span style="color:rgb(187,187,0)">2</span> <span style="color:rgb(0,187,187)">edge</span> <span style="color:rgb(187,0,0)">edges</span> <span style="color:rgb(0,187,0)">false</span> <span style="color:rgb(0,187,0)">false</span> <span style="color:rgb(0,187,0)">n/a</span> [ `<span style="color:rgb(187,187,0)">_from</span>`, `<span style="color:rgb(187,187,0)">_to</span>` ] <span style="color:rgb(0,187,187)">base OUTBOUND</span> 1 SingletonNode 1 * ROOT
2 TraversalNode 1 - FOR v /* vertex */, p /* paths */ IN 1..3 /* min..maxPathDepth */ OUTBOUND 'circles/A' /* startnode */ GRAPH 'traversalGraph'
3 CalculationNode 1 - LET localScopeVar = (RAND() &gt; 0.5) /* simple expression */
4 CalculationNode 1 - LET #6 = (p.`edges`[0].`theTruth` != localScopeVar) /* simple expression */
5 FilterNode 1 - FILTER #6
6 CalculationNode 1 - LET #8 = v.`_key` /* attribute expression */
7 ReturnNode 1 - RETURN #8
<span style="color:rgb(85,85,255)">Functions used:</span> Indexes used:
<span style="color:rgb(187,0,187)">Name</span> <span style="color:rgb(187,0,187)">Deterministic</span> <span style="color:rgb(187,0,187)">Cacheable</span> <span style="color:rgb(187,0,187)">Uses V8</span> By Type Collection Unique Sparse Selectivity Fields Ranges
<span style="color:rgb(187,187,0)">RAND</span> <span style="color:rgb(0,187,0)">false</span> <span style="color:rgb(0,187,0)">false</span> <span style="color:rgb(0,187,0)">false</span> 2 edge edges false false n/a [ `_from`, `_to` ] base OUTBOUND
<span style="color:rgb(85,85,255)">Traversals on graphs:</span> Functions used:
<span style="color:rgb(187,0,187)">Id</span> <span style="color:rgb(187,0,187)">Depth</span> <span style="color:rgb(187,0,187)">Vertex collections</span> <span style="color:rgb(187,0,187)">Edge collections</span> <span style="color:rgb(187,0,187)">Options</span> <span style="color:rgb(187,0,187)">Filter conditions</span> Name Deterministic Cacheable Uses V8
2 1..3 <span style="color:rgb(187,0,0)">circles</span> <span style="color:rgb(187,0,0)">edges</span> <span style="color:rgb(0,187,187)">uniqueVertices</span>: <span style="color:rgb(0,187,0)">none</span>, <span style="color:rgb(0,187,187)">uniqueEdges</span>: <span style="color:rgb(0,187,0)">path</span> RAND false false false
<span style="color:rgb(85,85,255)">Optimization rules applied:</span> Traversals on graphs:
<span style="color:rgb(187,0,187)">Id</span> <span style="color:rgb(187,0,187)">RuleName</span> Id Depth Vertex collections Edge collections Options Filter / Prune Conditions
<span style="color:rgb(187,187,0)">1</span> <span style="color:rgb(0,187,187)">move-calculations-up</span> 2 1..3 circles edges uniqueVertices: none, uniqueEdges: path
<span style="color:rgb(187,187,0)">2</span> <span style="color:rgb(0,187,187)">optimize-traversals</span>
<span style="color:rgb(187,187,0)">3</span> <span style="color:rgb(0,187,187)">move-calculations-down</span> Optimization rules applied:
Id RuleName
1 move-calculations-up
2 optimize-traversals
3 move-calculations-down

View File

@ -1,39 +1,39 @@
@Q: @Q:
FOR v,e,p IN <span class="hljs-number">1.</span><span class="hljs-number">.3</span> OUTBOUND <span class="hljs-string">'circles/A'</span> GRAPH <span class="hljs-string">'traversalGraph'</span> FOR v,e,p IN <span class="hljs-number">1.</span><span class="hljs-number">.3</span> OUTBOUND <span class="hljs-string">'circles/A'</span> GRAPH <span class="hljs-string">'traversalGraph'</span>
FILTER p.edges[<span class="hljs-number">0</span>].label == <span class="hljs-string">'right_foo'</span> FILTER p.edges[<span class="hljs-number">0</span>].label == <span class="hljs-string">'right_foo'</span>
RETURN v._key RETURN v._key
@R @R
<span style="color:rgb(85,85,255)">Query String:</span> Query String:
<span style="color:rgb(0,187,0)"> FOR v,e,p IN 1..3 OUTBOUND 'circles/A' GRAPH 'traversalGraph' FOR v,e,p IN 1..3 OUTBOUND 'circles/A' GRAPH 'traversalGraph'
FILTER p.edges[0].label == 'right_foo' FILTER p.edges[0].label == 'right_foo'
RETURN v._key RETURN v._key
</span>
<span style="color:rgb(85,85,255)">Execution plan:</span>
<span style="color:rgb(187,0,187)">Id</span> <span style="color:rgb(187,0,187)">NodeType</span> <span style="color:rgb(187,0,187)">Est.</span> <span style="color:rgb(187,0,187)">Comment</span>
<span style="color:rgb(187,187,0)">1</span> <span style="color:rgb(0,187,187)">SingletonNode</span> <span style="color:rgb(0,187,0)">1</span> * <span style="color:rgb(0,187,187)">ROOT</span>
<span style="color:rgb(187,187,0)">2</span> <span style="color:rgb(0,187,187)">TraversalNode</span> <span style="color:rgb(0,187,0)">1</span> - <span style="color:rgb(0,187,187)">FOR </span><span style="color:rgb(187,187,0)">v</span> <span style="color:rgb(0,0,187)">/* vertex */</span> <span style="color:rgb(0,187,187)">IN</span> <span style="color:rgb(0,187,0)">1..3</span> <span style="color:rgb(0,0,187)">/* min..maxPathDepth */</span> <span style="color:rgb(0,187,187)">OUTBOUND</span> '<span style="color:rgb(0,187,0)">circles/A</span>' <span style="color:rgb(0,0,187)">/* startnode */</span> <span style="color:rgb(0,187,187)">GRAPH</span> '<span style="color:rgb(0,187,0)">traversalGraph</span>'
<span style="color:rgb(187,187,0)">5</span> <span style="color:rgb(0,187,187)">CalculationNode</span> <span style="color:rgb(0,187,0)">1</span> - <span style="color:rgb(0,187,187)">LET</span> <span style="color:rgb(187,0,187)">#7</span> = <span style="color:rgb(187,187,0)">v</span>.`<span style="color:rgb(187,187,0)">_key</span>` <span style="color:rgb(0,0,187)">/* attribute expression */</span>
<span style="color:rgb(187,187,0)">6</span> <span style="color:rgb(0,187,187)">ReturnNode</span> <span style="color:rgb(0,187,0)">1</span> - <span style="color:rgb(0,187,187)">RETURN</span> <span style="color:rgb(187,0,187)">#7</span>
<span style="color:rgb(85,85,255)">Indexes used:</span> Execution plan:
<span style="color:rgb(187,0,187)">By</span> <span style="color:rgb(187,0,187)">Type</span> <span style="color:rgb(187,0,187)">Collection</span> <span style="color:rgb(187,0,187)">Unique</span> <span style="color:rgb(187,0,187)">Sparse</span> <span style="color:rgb(187,0,187)">Selectivity</span> <span style="color:rgb(187,0,187)">Fields</span> <span style="color:rgb(187,0,187)">Ranges</span> Id NodeType Est. Comment
<span style="color:rgb(187,187,0)">2</span> <span style="color:rgb(0,187,187)">edge</span> <span style="color:rgb(187,0,0)">edges</span> <span style="color:rgb(0,187,0)">false</span> <span style="color:rgb(0,187,0)">false</span> <span style="color:rgb(0,187,0)">n/a</span> [ `<span style="color:rgb(187,187,0)">_from</span>`, `<span style="color:rgb(187,187,0)">_to</span>` ] <span style="color:rgb(0,187,187)">base OUTBOUND</span> 1 SingletonNode 1 * ROOT
<span style="color:rgb(187,187,0)">2</span> <span style="color:rgb(0,187,187)">edge</span> <span style="color:rgb(187,0,0)">edges</span> <span style="color:rgb(0,187,0)">false</span> <span style="color:rgb(0,187,0)">false</span> <span style="color:rgb(0,187,0)">n/a</span> [ `<span style="color:rgb(187,187,0)">_from</span>`, `<span style="color:rgb(187,187,0)">_to</span>` ] <span style="color:rgb(0,187,187)">level 0 OUTBOUND</span> 2 TraversalNode 1 - FOR v /* vertex */ IN 1..3 /* min..maxPathDepth */ OUTBOUND 'circles/A' /* startnode */ GRAPH 'traversalGraph'
5 CalculationNode 1 - LET #7 = v.`_key` /* attribute expression */
6 ReturnNode 1 - RETURN #7
<span style="color:rgb(85,85,255)">Traversals on graphs:</span> Indexes used:
<span style="color:rgb(187,0,187)">Id</span> <span style="color:rgb(187,0,187)">Depth</span> <span style="color:rgb(187,0,187)">Vertex collections</span> <span style="color:rgb(187,0,187)">Edge collections</span> <span style="color:rgb(187,0,187)">Options</span> <span style="color:rgb(187,0,187)">Filter conditions</span> By Type Collection Unique Sparse Selectivity Fields Ranges
2 1..3 <span style="color:rgb(187,0,0)">circles</span> <span style="color:rgb(187,0,0)">edges</span> <span style="color:rgb(0,187,187)">uniqueVertices</span>: <span style="color:rgb(0,187,0)">none</span>, <span style="color:rgb(0,187,187)">uniqueEdges</span>: <span style="color:rgb(0,187,0)">path</span> (<span style="color:rgb(187,187,0)">p</span>.`<span style="color:rgb(187,187,0)">edges</span>`[<span style="color:rgb(0,187,0)">0</span>].`<span style="color:rgb(187,187,0)">label</span>` == <span style="color:rgb(0,187,0)">"right_foo"</span>) 2 edge edges false false n/a [ `_from`, `_to` ] base OUTBOUND
2 edge edges false false n/a [ `_from`, `_to` ] level 0 OUTBOUND
<span style="color:rgb(85,85,255)">Optimization rules applied:</span> Traversals on graphs:
<span style="color:rgb(187,0,187)">Id</span> <span style="color:rgb(187,0,187)">RuleName</span> Id Depth Vertex collections Edge collections Options Filter / Prune Conditions
<span style="color:rgb(187,187,0)">1</span> <span style="color:rgb(0,187,187)">move-calculations-up</span> 2 1..3 circles edges uniqueVertices: none, uniqueEdges: path FILTER (p.`edges`[0].`label` == "right_foo")
<span style="color:rgb(187,187,0)">2</span> <span style="color:rgb(0,187,187)">move-filters-up</span>
<span style="color:rgb(187,187,0)">3</span> <span style="color:rgb(0,187,187)">move-calculations-up-2</span> Optimization rules applied:
<span style="color:rgb(187,187,0)">4</span> <span style="color:rgb(0,187,187)">move-filters-up-2</span> Id RuleName
<span style="color:rgb(187,187,0)">5</span> <span style="color:rgb(0,187,187)">optimize-traversals</span> 1 move-calculations-up
<span style="color:rgb(187,187,0)">6</span> <span style="color:rgb(0,187,187)">remove-filter-covered-by-traversal</span> 2 move-filters-up
<span style="color:rgb(187,187,0)">7</span> <span style="color:rgb(0,187,187)">remove-unnecessary-calculations-2</span> 3 move-calculations-up-2
<span style="color:rgb(187,187,0)">8</span> <span style="color:rgb(0,187,187)">remove-redundant-path-var</span> 4 move-filters-up-2
5 optimize-traversals
6 remove-filter-covered-by-traversal
7 remove-unnecessary-calculations-2
8 remove-redundant-path-var

View File

@ -1,9 +1,9 @@
@Q: @Q:
FOR v, e, p IN <span class="hljs-number">1.</span><span class="hljs-number">.5</span> OUTBOUND <span class="hljs-string">'circles/A'</span> GRAPH <span class="hljs-string">'traversalGraph'</span> FOR v, e, p IN <span class="hljs-number">1.</span><span class="hljs-number">.5</span> OUTBOUND <span class="hljs-string">'circles/A'</span> GRAPH <span class="hljs-string">'traversalGraph'</span>
FILTER p.edges[<span class="hljs-number">0</span>].theTruth == <span class="hljs-literal">true</span> FILTER p.edges[<span class="hljs-number">0</span>].theTruth == <span class="hljs-literal">true</span>
AND p.edges[<span class="hljs-number">1</span>].theFalse == <span class="hljs-literal">false</span> AND p.edges[<span class="hljs-number">1</span>].theFalse == <span class="hljs-literal">false</span>
FILTER p.vertices[<span class="hljs-number">1</span>]._key == <span class="hljs-string">"G"</span> FILTER p.vertices[<span class="hljs-number">1</span>]._key == <span class="hljs-string">"G"</span>
RETURN { <span class="hljs-attr">vertices</span>: p.vertices[*]._key, <span class="hljs-attr">edges</span>: p.edges[*].label } RETURN { <span class="hljs-attr">vertices</span>: p.vertices[*]._key, <span class="hljs-attr">edges</span>: p.edges[*].label }
@R @R
[ [

View File

@ -1,7 +1,7 @@
@Q: @Q:
FOR v, e, p IN <span class="hljs-number">1.</span><span class="hljs-number">.5</span> OUTBOUND <span class="hljs-string">'circles/A'</span> GRAPH <span class="hljs-string">'traversalGraph'</span> FOR v, e, p IN <span class="hljs-number">1.</span><span class="hljs-number">.5</span> OUTBOUND <span class="hljs-string">'circles/A'</span> GRAPH <span class="hljs-string">'traversalGraph'</span>
FILTER p.edges[<span class="hljs-number">0</span>].theTruth == <span class="hljs-literal">true</span> FILTER p.edges[<span class="hljs-number">0</span>].theTruth == <span class="hljs-literal">true</span>
RETURN { <span class="hljs-attr">vertices</span>: p.vertices[*]._key, <span class="hljs-attr">edges</span>: p.edges[*].label } RETURN { <span class="hljs-attr">vertices</span>: p.vertices[*]._key, <span class="hljs-attr">edges</span>: p.edges[*].label }
@R @R
[ [

View File

@ -1,7 +1,7 @@
@Q: @Q:
FOR v, e, p IN <span class="hljs-number">1.</span><span class="hljs-number">.5</span> OUTBOUND <span class="hljs-string">'circles/A'</span> GRAPH <span class="hljs-string">'traversalGraph'</span> FOR v, e, p IN <span class="hljs-number">1.</span><span class="hljs-number">.5</span> OUTBOUND <span class="hljs-string">'circles/A'</span> GRAPH <span class="hljs-string">'traversalGraph'</span>
FILTER p.edges[*].theTruth ALL == <span class="hljs-literal">true</span> FILTER p.edges[*].theTruth ALL == <span class="hljs-literal">true</span>
RETURN { <span class="hljs-attr">vertices</span>: p.vertices[*]._key, <span class="hljs-attr">edges</span>: p.edges[*].label } RETURN { <span class="hljs-attr">vertices</span>: p.vertices[*]._key, <span class="hljs-attr">edges</span>: p.edges[*].label }
@R @R
[ [

View File

@ -1,7 +1,7 @@
@Q: @Q:
FOR v, e, p IN <span class="hljs-number">1.</span><span class="hljs-number">.5</span> OUTBOUND <span class="hljs-string">'circles/A'</span> GRAPH <span class="hljs-string">'traversalGraph'</span> FOR v, e, p IN <span class="hljs-number">1.</span><span class="hljs-number">.5</span> OUTBOUND <span class="hljs-string">'circles/A'</span> GRAPH <span class="hljs-string">'traversalGraph'</span>
FILTER p.edges[*].theTruth ANY == <span class="hljs-literal">true</span> FILTER p.edges[*].theTruth ANY == <span class="hljs-literal">true</span>
RETURN { <span class="hljs-attr">vertices</span>: p.vertices[*]._key, <span class="hljs-attr">edges</span>: p.edges[*].label } RETURN { <span class="hljs-attr">vertices</span>: p.vertices[*]._key, <span class="hljs-attr">edges</span>: p.edges[*].label }
@R @R
[ [

View File

@ -1,7 +1,7 @@
@Q: @Q:
FOR v, e, p IN <span class="hljs-number">1.</span><span class="hljs-number">.5</span> OUTBOUND <span class="hljs-string">'circles/A'</span> GRAPH <span class="hljs-string">'traversalGraph'</span> FOR v, e, p IN <span class="hljs-number">1.</span><span class="hljs-number">.5</span> OUTBOUND <span class="hljs-string">'circles/A'</span> GRAPH <span class="hljs-string">'traversalGraph'</span>
FILTER p.edges[*].theTruth NONE == <span class="hljs-literal">true</span> FILTER p.edges[*].theTruth NONE == <span class="hljs-literal">true</span>
RETURN { <span class="hljs-attr">vertices</span>: p.vertices[*]._key, <span class="hljs-attr">edges</span>: p.edges[*].label } RETURN { <span class="hljs-attr">vertices</span>: p.vertices[*]._key, <span class="hljs-attr">edges</span>: p.edges[*].label }
@R @R
[] []

View File

@ -1,7 +1,7 @@
@Q: @Q:
FOR v, e, p IN <span class="hljs-number">1.</span><span class="hljs-number">.5</span> OUTBOUND <span class="hljs-string">'circles/A'</span> GRAPH <span class="hljs-string">'traversalGraph'</span> FOR v, e, p IN <span class="hljs-number">1.</span><span class="hljs-number">.5</span> OUTBOUND <span class="hljs-string">'circles/A'</span> GRAPH <span class="hljs-string">'traversalGraph'</span>
FILTER p.vertices[<span class="hljs-number">1</span>]._key == <span class="hljs-string">"G"</span> FILTER p.vertices[<span class="hljs-number">1</span>]._key == <span class="hljs-string">"G"</span>
RETURN { <span class="hljs-attr">vertices</span>: p.vertices[*]._key, <span class="hljs-attr">edges</span>: p.edges[*].label } RETURN { <span class="hljs-attr">vertices</span>: p.vertices[*]._key, <span class="hljs-attr">edges</span>: p.edges[*].label }
@R @R
[ [

View File

@ -0,0 +1,7 @@
@Q:
FOR v, e, p IN <span class="hljs-number">1.</span><span class="hljs-number">.5</span> OUTBOUND <span class="hljs-string">'circles/A'</span> GRAPH <span class="hljs-string">'traversalGraph'</span>
PRUNE IS_SAME_COLLECTION(<span class="hljs-string">'circles'</span>, v)
RETURN { <span class="hljs-attr">vertices</span>: p.vertices[*]._key, <span class="hljs-attr">edges</span>: p.edges[*].label }
@R
[]

View File

@ -0,0 +1,26 @@
@Q:
FOR v, e, p IN <span class="hljs-number">1.</span><span class="hljs-number">.5</span> OUTBOUND <span class="hljs-string">'circles/A'</span> GRAPH <span class="hljs-string">'traversalGraph'</span>
PRUNE e.theTruth == <span class="hljs-literal">true</span>
RETURN { <span class="hljs-attr">vertices</span>: p.vertices[*]._key, <span class="hljs-attr">edges</span>: p.edges[*].label }
@R
[
{
<span class="hljs-string">"vertices"</span>: [
<span class="hljs-string">"A"</span>,
<span class="hljs-string">"B"</span>
],
<span class="hljs-string">"edges"</span>: [
<span class="hljs-string">"left_bar"</span>
]
},
{
<span class="hljs-string">"vertices"</span>: [
<span class="hljs-string">"A"</span>,
<span class="hljs-string">"G"</span>
],
<span class="hljs-string">"edges"</span>: [
<span class="hljs-string">"right_foo"</span>
]
}
]

View File

@ -0,0 +1,18 @@
@Q:
FOR v, e, p IN <span class="hljs-number">1.</span><span class="hljs-number">.5</span> OUTBOUND <span class="hljs-string">'circles/A'</span> GRAPH <span class="hljs-string">'traversalGraph'</span>
PRUNE v._key == <span class="hljs-string">'G'</span>
FILTER v._key == <span class="hljs-string">'G'</span>
RETURN { <span class="hljs-attr">vertices</span>: p.vertices[*]._key, <span class="hljs-attr">edges</span>: p.edges[*].label }
@R
[
{
<span class="hljs-string">"vertices"</span>: [
<span class="hljs-string">"A"</span>,
<span class="hljs-string">"G"</span>
],
<span class="hljs-string">"edges"</span>: [
<span class="hljs-string">"right_foo"</span>
]
}
]

View File

@ -1,6 +1,6 @@
@Q: @Q:
RETURN GEO_LINESTRING([ RETURN GEO_LINESTRING([
[<span class="hljs-number">35</span>, <span class="hljs-number">10</span>], [<span class="hljs-number">45</span>, <span class="hljs-number">45</span>] [<span class="hljs-number">35</span>, <span class="hljs-number">10</span>], [<span class="hljs-number">45</span>, <span class="hljs-number">45</span>]
]) ])
@R @R

View File

@ -1,7 +1,7 @@
@Q: @Q:
RETURN GEO_MULTILINESTRING([ RETURN GEO_MULTILINESTRING([
[[<span class="hljs-number">100.0</span>, <span class="hljs-number">0.0</span>], [<span class="hljs-number">101.0</span>, <span class="hljs-number">1.0</span>]], [[<span class="hljs-number">100.0</span>, <span class="hljs-number">0.0</span>], [<span class="hljs-number">101.0</span>, <span class="hljs-number">1.0</span>]],
[[<span class="hljs-number">102.0</span>, <span class="hljs-number">2.0</span>], [<span class="hljs-number">101.0</span>, <span class="hljs-number">2.3</span>]] [[<span class="hljs-number">102.0</span>, <span class="hljs-number">2.0</span>], [<span class="hljs-number">101.0</span>, <span class="hljs-number">2.3</span>]]
]) ])
@R @R

View File

@ -1,6 +1,6 @@
@Q: @Q:
RETURN GEO_MULTIPOINT([ RETURN GEO_MULTIPOINT([
[<span class="hljs-number">35</span>, <span class="hljs-number">10</span>], [<span class="hljs-number">45</span>, <span class="hljs-number">45</span>] [<span class="hljs-number">35</span>, <span class="hljs-number">10</span>], [<span class="hljs-number">45</span>, <span class="hljs-number">45</span>]
]) ])
@R @R

View File

@ -1,12 +1,12 @@
@Q: @Q:
RETURN GEO_MULTIPOLYGON([ RETURN GEO_MULTIPOLYGON([
[ [
[[<span class="hljs-number">40</span>, <span class="hljs-number">40</span>], [<span class="hljs-number">20</span>, <span class="hljs-number">45</span>], [<span class="hljs-number">45</span>, <span class="hljs-number">30</span>], [<span class="hljs-number">40</span>, <span class="hljs-number">40</span>]] [[<span class="hljs-number">40</span>, <span class="hljs-number">40</span>], [<span class="hljs-number">20</span>, <span class="hljs-number">45</span>], [<span class="hljs-number">45</span>, <span class="hljs-number">30</span>], [<span class="hljs-number">40</span>, <span class="hljs-number">40</span>]]
], ],
[ [
[[<span class="hljs-number">20</span>, <span class="hljs-number">35</span>], [<span class="hljs-number">10</span>, <span class="hljs-number">30</span>], [<span class="hljs-number">10</span>, <span class="hljs-number">10</span>], [<span class="hljs-number">30</span>, <span class="hljs-number">5</span>], [<span class="hljs-number">45</span>, <span class="hljs-number">20</span>], [<span class="hljs-number">20</span>, <span class="hljs-number">35</span>]], [[<span class="hljs-number">20</span>, <span class="hljs-number">35</span>], [<span class="hljs-number">10</span>, <span class="hljs-number">30</span>], [<span class="hljs-number">10</span>, <span class="hljs-number">10</span>], [<span class="hljs-number">30</span>, <span class="hljs-number">5</span>], [<span class="hljs-number">45</span>, <span class="hljs-number">20</span>], [<span class="hljs-number">20</span>, <span class="hljs-number">35</span>]],
[[<span class="hljs-number">30</span>, <span class="hljs-number">20</span>], [<span class="hljs-number">20</span>, <span class="hljs-number">15</span>], [<span class="hljs-number">20</span>, <span class="hljs-number">25</span>], [<span class="hljs-number">30</span>, <span class="hljs-number">20</span>]] [[<span class="hljs-number">30</span>, <span class="hljs-number">20</span>], [<span class="hljs-number">20</span>, <span class="hljs-number">15</span>], [<span class="hljs-number">20</span>, <span class="hljs-number">25</span>], [<span class="hljs-number">30</span>, <span class="hljs-number">20</span>]]
] ]
]) ])
@R @R

View File

@ -1,6 +1,6 @@
@Q: @Q:
RETURN GEO_POLYGON([ RETURN GEO_POLYGON([
[<span class="hljs-number">0.0</span>, <span class="hljs-number">0.0</span>], [<span class="hljs-number">7.5</span>, <span class="hljs-number">2.5</span>], [<span class="hljs-number">0.0</span>, <span class="hljs-number">5.0</span>] [<span class="hljs-number">0.0</span>, <span class="hljs-number">0.0</span>], [<span class="hljs-number">7.5</span>, <span class="hljs-number">2.5</span>], [<span class="hljs-number">0.0</span>, <span class="hljs-number">5.0</span>]
]) ])
@R @R

View File

@ -1,7 +1,7 @@
@Q: @Q:
RETURN GEO_POLYGON([ RETURN GEO_POLYGON([
[[<span class="hljs-number">35</span>, <span class="hljs-number">10</span>], [<span class="hljs-number">45</span>, <span class="hljs-number">45</span>], [<span class="hljs-number">15</span>, <span class="hljs-number">40</span>], [<span class="hljs-number">10</span>, <span class="hljs-number">20</span>], [<span class="hljs-number">35</span>, <span class="hljs-number">10</span>]], [[<span class="hljs-number">35</span>, <span class="hljs-number">10</span>], [<span class="hljs-number">45</span>, <span class="hljs-number">45</span>], [<span class="hljs-number">15</span>, <span class="hljs-number">40</span>], [<span class="hljs-number">10</span>, <span class="hljs-number">20</span>], [<span class="hljs-number">35</span>, <span class="hljs-number">10</span>]],
[[<span class="hljs-number">20</span>, <span class="hljs-number">30</span>], [<span class="hljs-number">35</span>, <span class="hljs-number">35</span>], [<span class="hljs-number">30</span>, <span class="hljs-number">20</span>], [<span class="hljs-number">20</span>, <span class="hljs-number">30</span>]] [[<span class="hljs-number">20</span>, <span class="hljs-number">30</span>], [<span class="hljs-number">35</span>, <span class="hljs-number">35</span>], [<span class="hljs-number">30</span>, <span class="hljs-number">20</span>], [<span class="hljs-number">20</span>, <span class="hljs-number">30</span>]]
]) ])
@R @R

View File

@ -83,6 +83,23 @@
"section" : "console", "section" : "console",
"type" : "boolean" "type" : "boolean"
}, },
"console.history" : {
"category" : "option",
"default" : true,
"deprecatedIn" : null,
"description" : "whether or not to load and persist command-line history",
"dynamic" : false,
"enterpriseOnly" : false,
"hidden" : false,
"introducedIn" : [
"v3.4.5",
"v3.5.0"
],
"obsolete" : false,
"requiresValue" : false,
"section" : "console",
"type" : "boolean"
},
"console.pager" : { "console.pager" : {
"category" : "option", "category" : "option",
"default" : false, "default" : false,

View File

@ -83,6 +83,23 @@
"section" : "console", "section" : "console",
"type" : "boolean" "type" : "boolean"
}, },
"console.history" : {
"category" : "option",
"default" : true,
"deprecatedIn" : null,
"description" : "whether or not to load and persist command-line history",
"dynamic" : false,
"enterpriseOnly" : false,
"hidden" : false,
"introducedIn" : [
"v3.4.5",
"v3.5.0"
],
"obsolete" : false,
"requiresValue" : false,
"section" : "console",
"type" : "boolean"
},
"console.pager" : { "console.pager" : {
"category" : "option", "category" : "option",
"default" : false, "default" : false,