mirror of https://gitee.com/bigwinds/arangodb
117 lines
5.0 KiB
Markdown
117 lines
5.0 KiB
Markdown
SmartGraphs
|
|
===========
|
|
|
|
{% hint 'info' %}
|
|
This feature is only available in the
|
|
[**Enterprise Edition**](https://www.arangodb.com/why-arangodb/arangodb-enterprise/)
|
|
{% endhint %}
|
|
|
|
This chapter describes the `smart-graph` module, which enables you to manage
|
|
graphs at scale. It will give a vast performance benefit for all graphs sharded
|
|
in an ArangoDB Cluster. On a single server this feature is pointless, hence it
|
|
is only available in cluster mode.
|
|
|
|
In terms of querying there is no difference between SmartGraphs and
|
|
General Graphs. The former is a transparent replacement for the latter.
|
|
For graph querying please refer to [AQL Graph Operations](../../../AQL/Graphs/index.html)
|
|
and [General Graph Functions](../GeneralGraphs/Functions.md) sections.
|
|
The optimizer is clever enough to identify whether it is a SmartGraph or not.
|
|
|
|
The difference is only in the management section: creating and modifying the
|
|
underlying collections of the graph. For a detailed API reference please refer
|
|
to [SmartGraph Management](Management.md).
|
|
|
|
Do the hands-on
|
|
[ArangoDB SmartGraphs Tutorial](https://www.arangodb.com/using-smartgraphs-arangodb/)
|
|
to learn more.
|
|
|
|
What makes a graph smart?
|
|
-------------------------
|
|
|
|
Most graphs have one feature that divides the entire graph into several smaller
|
|
subgraphs. These subgraphs have a large amount of edges that only connect
|
|
vertices in the same subgraph and only have few edges connecting vertices from
|
|
other subgraphs.
|
|
|
|
Examples for these graphs are:
|
|
|
|
- **Social Networks**<br/>
|
|
Typically the feature here is the region/country users live in.
|
|
Every user typically has more contacts in the same region/country then she
|
|
has in other regions/countries
|
|
|
|
- **Transport Systems**<br/>
|
|
For those also the feature is the region/country. You have many local
|
|
transportation but only few across countries.
|
|
|
|
- **E-Commerce**<br/>
|
|
In this case probably the category of products is a good feature.
|
|
Often products of the same category are bought together.
|
|
|
|
If this feature is known, SmartGraphs can make use if it.
|
|
|
|
When creating a SmartGraph you have to define a smartAttribute, which is the
|
|
name of an attribute stored in every vertex. The graph will than be
|
|
automatically sharded in such a way that all vertices with the same value are
|
|
stored on the same physical machine, all edges connecting vertices with
|
|
identical smartAttribute values are stored on this machine as well.
|
|
During query time the query optimizer and the query executor both know for
|
|
every document exactly where it is stored and can thereby minimize network
|
|
overhead. Everything that can be computed locally will be computed locally.
|
|
|
|
Benefits of SmartGraphs
|
|
-----------------------
|
|
|
|
Because of the above described guaranteed sharding, the performance of queries
|
|
that only cover one subgraph have a performance almost equal to an only local
|
|
computation. Queries that cover more than one subgraph require some network
|
|
overhead. The more subgraphs are touched the more network cost will apply.
|
|
However the overall performance is never worse than the same query using a
|
|
General Graph.
|
|
|
|
Getting started
|
|
---------------
|
|
|
|
First of all SmartGraphs *cannot use existing collections*, when switching to
|
|
SmartGraph from an existing data set you have to import the data into a fresh
|
|
SmartGraph. This switch can be easily achieved with
|
|
[arangodump](../../Programs/Arangodump/README.md) and
|
|
[arangorestore](../../Programs/Arangorestore/README.md).
|
|
The only thing you have to change in this pipeline is that you create the new
|
|
collections with the SmartGraph before starting `arangorestore`.
|
|
|
|
- Create a graph
|
|
|
|
In comparison to General Graph we have to add more options when creating the
|
|
graph. The two options `smartGraphAttribute` and `numberOfShards` are
|
|
required and cannot be modified later.
|
|
|
|
@startDocuBlockInline smartGraphCreateGraphHowTo1
|
|
arangosh> var graph_module = require("@arangodb/smart-graph");
|
|
arangosh> var graph = graph_module._create("myGraph", [], [], {smartGraphAttribute: "region", numberOfShards: 9});
|
|
arangosh> graph;
|
|
[ SmartGraph myGraph EdgeDefinitions: [ ] VertexCollections: [ ] ]
|
|
@endDocuBlock smartGraphCreateGraphHowTo1
|
|
|
|
- Add some vertex collections
|
|
|
|
This is again identical to General Graph. The module will setup correct
|
|
sharding for all these collections. *Note*: The collections have to be new.
|
|
|
|
@startDocuBlockInline smartGraphCreateGraphHowTo2
|
|
arangosh> graph._addVertexCollection("shop");
|
|
arangosh> graph._addVertexCollection("customer");
|
|
arangosh> graph._addVertexCollection("pet");
|
|
arangosh> graph;
|
|
[ SmartGraph myGraph EdgeDefinitions: [ ] VertexCollections: [ "shop", "customer", "pet" ] ]
|
|
@endDocuBlock smartGraphCreateGraphHowTo2
|
|
|
|
- Define relations on the Graph
|
|
|
|
@startDocuBlockInline smartGraphCreateGraphHowTo3
|
|
arangosh> var rel = graph_module._relation("isCustomer", ["shop"], ["customer"]);
|
|
arangosh> graph._extendEdgeDefinitions(rel);
|
|
arangosh> graph;
|
|
[ SmartGraph myGraph EdgeDefinitions: [ "isCustomer: [shop] -> [customer]" ] VertexCollections: [ "pet" ] ]
|
|
@endDocuBlock smartGraphCreateGraphHowTo3
|