ArangoDB - 图创建基础
ArangoDB - Graph creation basics
我是 ArangoDB 的新手。我熟悉 Neo4J,但被 ArangoDB 的性能和多模型设计所吸引。文档看起来很深,但是我入门有点困难。
我想知道进行一些基本图形操作的简单方法。到目前为止,我所发现的一切都告诉我如何将整个集合连接在一起,但我希望能够简单地定义一个节点,定义另一个节点,并定义它们之间的边。
最好是通过 HTTP,我怎样才能:
- 向图中添加一个节点
- 在我添加到图表中的两个节点之间创建一条边
- 创建一个集合并将现有节点添加到该集合
例如,我想创建一个简单的图形,就像这里所示的树:https://www.arangodb.com/2015/07/data-modeling-with-multi-model-databases/
我想要有关如何创建此图的子集的基本说明。我愿意:
- 在名为
fleets
的集合中创建名为 airline0
和 airline1
的节点。
- 在名为
planes
的集合中创建节点 plane0
、plane1
、plane2
。 - 在每个平面的文档中放置一个任意属性 - 让我们说颜色。
- 在名为
pilots
的集合中创建一个名为 Jennifer
的节点。
接下来,我想把图表连接起来。根据文档,看起来边缘本身就是文档,因此可以具有属性。我想创建以下边缘:
(airline0)-[owns]->(plane0)
(airline0)-[owns]->(plane1)
这条边有 since: 2013
作为属性
(airline1)-[owns]->(plane2)
(airline1)-[previouslyOwned]->(plane1)
between: [1999,2013]
(plane0)-[inFleet]->(airline0)
(plane1)-[inFleet]->(airline0)
(plane1)-[wasInFleet]->(airline1)
between: [1999,2013]
(plane2)-[inFleet]->(airline1)
(jennifer)-[canfly]->(plane0)
(plane0)-[hasPilot]->(jennifer)
请告诉我如何通过 HTTP 创建这样的图表。如果不是 HTTP,我想知道如何通过 arangosh 执行此操作。
让我从 arangosh 开始,因为它更容易阅读。我会将 HTTP 命令作为附录提供。
ArangoDB Shell
您将需要上面提到的三个文档集合 "fleets"、"planes" 和 "pilots" 以及至少一个边
集合来保存图形结构。如果你想遍历在"owns"和"inFleet"和"canfly"之间跳跃的图结构,我建议
使用一个集合 "relations" 并为边缘赋予属性 "type".
另一种解决方案是使用三个边缘集合 "owns" 和 "inFleet" 以及 "canfly"。为了做出更基于事实的建议,最好了解更多关于您的用例。
arangosh [_system]> db._create("fleets");
[ArangoCollection 139792431, "fleets" (type document, status loaded)]
arangosh [_system]> db._create("planes");
[ArangoCollection 140382255, "planes" (type document, status loaded)]
arangosh [_system]> db._create("pilots");
[ArangoCollection 140972079, "pilots" (type document, status loaded)]
arangosh [_system]> db._createEdgeCollection("relations");
[ArangoCollection 141103151, "relations" (type edge, status loaded)]
接下来,在集合 "fleets" 中创建文档。我将使用航空公司的名称作为键。根据您的用例,可能有更好的密钥。例如,也许有一个通用缩写(如 LH 代表 Lufthansa)。
arangosh [_system]> db.fleets.save({ _key: "airline0", name: "Airline 0" });
arangosh [_system]> db.fleets.save({ _key: "airline1", name: "Airline 1" });
对飞机和飞行员重复相同的操作:
arangosh [_system]> db.planes.save({ _key: "plane0", name: "Plane Zero", color: "red" })
arangosh [_system]> db.planes.save({ _key: "plane1", name: "Plane One", color: "red" })
arangosh [_system]> db.planes.save({ _key: "plane2", name: "Plane One", color: "green" })
arangosh [_system]> db.pilots.save({ _key: "jennifer", name: "Jenifer" });
您应该 select 根据您的使用情况设置密钥。如果没有 "natural" 键,则省略“_key”属性。 ArangoDB 将为您生成一个唯一的密钥。
接下来,添加上面创建的节点之间的关系。 ArangoDB 2.8 中的语法类似于上面创建文档。此外,
您需要提供要连接的顶点的 "from" 和 "to" 键。
arangosh [_system]> db.relations.save("fleets/airline0", "planes/plane0", { type: 'owns' });
arangosh [_system]> db.relations.save("fleets/airline0", "planes/plane1", { type: 'owns', since: 2013 });
arangosh [_system]> db.relations.save("fleets/airline1", "planes/plane2", { type: 'owns' });
arangosh [_system]> db.relations.save("fleets/airline1", "planes/plane1", { type: 'previouslyOwned', begin: 1999, end: 2013 });
arangosh [_system]> db.relations.save("pilots/jennifer", "planes/plane0", { type: 'canfly' });
如果 'inFleet' / 'wasInFleet' / 'hasPilot' 是 'owns' / 'previouslyOwned' / 'canfly' 的反义词,则不需要为其创建单独的边,因为边是定向的。
如果 'owns' 和 'inFleet' 之间存在差异,您可以创建类似于上面的关系:
arangosh [_system]> db.relations.save("planes/plane0", "fleets/airline0", { type: 'inFleet' });
...
现在为了遵循路径 "jennifer can fly planeX owned by airlineY" 使用:
arangosh> db._query("FOR v, e IN OUTBOUND 'pilots/jennifer' relations FILTER e.type == 'canfly' FOR w, f IN INBOUND v relations FILTER f.type == 'owns' RETURN { plane: v, airline: w }")
[
{
"plane" : {
"color" : "red",
"name" : "Plane Zero",
"_id" : "planes/plane0",
"_rev" : "153686063",
"_key" : "plane0"
},
"airline" : {
"name" : "Airline 0",
"_id" : "fleets/airline0",
"_rev" : "149884975",
"_key" : "airline0"
}
}
]
或反转路径(不使用 'inFleet' 和 'hasPilot'):
arangosh> db._query("FOR v, e IN OUTBOUND 'fleets/airline0' relations FILTER e.type == 'owns' FOR w, f IN INBOUND v relations FILTER f.type == 'canfly' RETURN { plane: v, w: w }")
[
{
"plane" : {
"color" : "red",
"name" : "Plane Zero",
"_id" : "planes/plane0",
"_rev" : "153686063",
"_key" : "plane0"
},
"w" : {
"_id" : "pilots/jennifer",
"_rev" : "330240047",
"_key" : "jennifer"
}
}
]
HTTP
让我举例说明上面执行的各种类型的命令。
arangosh [_system]> db._create("fleets");
这转化为
curl -X POST --data-binary @- --dump - http://localhost:8529/_api/collection <<EOF
{
"name" : "fleets"
}
EOF
下一个
arangosh [_system]> db._createEdgeCollection("relations");
转换为
curl -X POST --data-binary @- --dump - http://localhost:8529/_api/collection <<EOF
{
"name" : "relations", "type": 3
}
EOF
下一个
arangosh [_system]> db.fleets.save({ _key: "airline0", name: "Airline 0" });
转换为
curl -X POST --data-binary @- --dump - http://localhost:8529/_api/document?collection=products <<EOF
{ "_key": "airline0", "name": "Airline 0" }
EOF
下一个
db.relations.save("pilots/jennifer", "planes/plane0", { type: 'canfly' });
转换为
curl -X POST --data-binary @- --dump - http://localhost:8529/_api/edge/?collection=relations&from=pilots/jennifer&to=planes/plane0 <<EOF
{
"type" : "canfly"
}
EOF
我是 ArangoDB 的新手。我熟悉 Neo4J,但被 ArangoDB 的性能和多模型设计所吸引。文档看起来很深,但是我入门有点困难。
我想知道进行一些基本图形操作的简单方法。到目前为止,我所发现的一切都告诉我如何将整个集合连接在一起,但我希望能够简单地定义一个节点,定义另一个节点,并定义它们之间的边。
最好是通过 HTTP,我怎样才能:
- 向图中添加一个节点
- 在我添加到图表中的两个节点之间创建一条边
- 创建一个集合并将现有节点添加到该集合
例如,我想创建一个简单的图形,就像这里所示的树:https://www.arangodb.com/2015/07/data-modeling-with-multi-model-databases/
我想要有关如何创建此图的子集的基本说明。我愿意:
- 在名为
fleets
的集合中创建名为airline0
和airline1
的节点。 - 在名为
planes
的集合中创建节点plane0
、plane1
、plane2
。 - 在每个平面的文档中放置一个任意属性 - 让我们说颜色。 - 在名为
pilots
的集合中创建一个名为Jennifer
的节点。
接下来,我想把图表连接起来。根据文档,看起来边缘本身就是文档,因此可以具有属性。我想创建以下边缘:
(airline0)-[owns]->(plane0)
(airline0)-[owns]->(plane1)
这条边有since: 2013
作为属性(airline1)-[owns]->(plane2)
(airline1)-[previouslyOwned]->(plane1)
between: [1999,2013]
(plane0)-[inFleet]->(airline0)
(plane1)-[inFleet]->(airline0)
(plane1)-[wasInFleet]->(airline1)
between: [1999,2013]
(plane2)-[inFleet]->(airline1)
(jennifer)-[canfly]->(plane0)
(plane0)-[hasPilot]->(jennifer)
请告诉我如何通过 HTTP 创建这样的图表。如果不是 HTTP,我想知道如何通过 arangosh 执行此操作。
让我从 arangosh 开始,因为它更容易阅读。我会将 HTTP 命令作为附录提供。
ArangoDB Shell
您将需要上面提到的三个文档集合 "fleets"、"planes" 和 "pilots" 以及至少一个边 集合来保存图形结构。如果你想遍历在"owns"和"inFleet"和"canfly"之间跳跃的图结构,我建议 使用一个集合 "relations" 并为边缘赋予属性 "type".
另一种解决方案是使用三个边缘集合 "owns" 和 "inFleet" 以及 "canfly"。为了做出更基于事实的建议,最好了解更多关于您的用例。
arangosh [_system]> db._create("fleets");
[ArangoCollection 139792431, "fleets" (type document, status loaded)]
arangosh [_system]> db._create("planes");
[ArangoCollection 140382255, "planes" (type document, status loaded)]
arangosh [_system]> db._create("pilots");
[ArangoCollection 140972079, "pilots" (type document, status loaded)]
arangosh [_system]> db._createEdgeCollection("relations");
[ArangoCollection 141103151, "relations" (type edge, status loaded)]
接下来,在集合 "fleets" 中创建文档。我将使用航空公司的名称作为键。根据您的用例,可能有更好的密钥。例如,也许有一个通用缩写(如 LH 代表 Lufthansa)。
arangosh [_system]> db.fleets.save({ _key: "airline0", name: "Airline 0" });
arangosh [_system]> db.fleets.save({ _key: "airline1", name: "Airline 1" });
对飞机和飞行员重复相同的操作:
arangosh [_system]> db.planes.save({ _key: "plane0", name: "Plane Zero", color: "red" })
arangosh [_system]> db.planes.save({ _key: "plane1", name: "Plane One", color: "red" })
arangosh [_system]> db.planes.save({ _key: "plane2", name: "Plane One", color: "green" })
arangosh [_system]> db.pilots.save({ _key: "jennifer", name: "Jenifer" });
您应该 select 根据您的使用情况设置密钥。如果没有 "natural" 键,则省略“_key”属性。 ArangoDB 将为您生成一个唯一的密钥。
接下来,添加上面创建的节点之间的关系。 ArangoDB 2.8 中的语法类似于上面创建文档。此外, 您需要提供要连接的顶点的 "from" 和 "to" 键。
arangosh [_system]> db.relations.save("fleets/airline0", "planes/plane0", { type: 'owns' });
arangosh [_system]> db.relations.save("fleets/airline0", "planes/plane1", { type: 'owns', since: 2013 });
arangosh [_system]> db.relations.save("fleets/airline1", "planes/plane2", { type: 'owns' });
arangosh [_system]> db.relations.save("fleets/airline1", "planes/plane1", { type: 'previouslyOwned', begin: 1999, end: 2013 });
arangosh [_system]> db.relations.save("pilots/jennifer", "planes/plane0", { type: 'canfly' });
如果 'inFleet' / 'wasInFleet' / 'hasPilot' 是 'owns' / 'previouslyOwned' / 'canfly' 的反义词,则不需要为其创建单独的边,因为边是定向的。
如果 'owns' 和 'inFleet' 之间存在差异,您可以创建类似于上面的关系:
arangosh [_system]> db.relations.save("planes/plane0", "fleets/airline0", { type: 'inFleet' });
...
现在为了遵循路径 "jennifer can fly planeX owned by airlineY" 使用:
arangosh> db._query("FOR v, e IN OUTBOUND 'pilots/jennifer' relations FILTER e.type == 'canfly' FOR w, f IN INBOUND v relations FILTER f.type == 'owns' RETURN { plane: v, airline: w }")
[
{
"plane" : {
"color" : "red",
"name" : "Plane Zero",
"_id" : "planes/plane0",
"_rev" : "153686063",
"_key" : "plane0"
},
"airline" : {
"name" : "Airline 0",
"_id" : "fleets/airline0",
"_rev" : "149884975",
"_key" : "airline0"
}
}
]
或反转路径(不使用 'inFleet' 和 'hasPilot'):
arangosh> db._query("FOR v, e IN OUTBOUND 'fleets/airline0' relations FILTER e.type == 'owns' FOR w, f IN INBOUND v relations FILTER f.type == 'canfly' RETURN { plane: v, w: w }")
[
{
"plane" : {
"color" : "red",
"name" : "Plane Zero",
"_id" : "planes/plane0",
"_rev" : "153686063",
"_key" : "plane0"
},
"w" : {
"_id" : "pilots/jennifer",
"_rev" : "330240047",
"_key" : "jennifer"
}
}
]
HTTP
让我举例说明上面执行的各种类型的命令。
arangosh [_system]> db._create("fleets");
这转化为
curl -X POST --data-binary @- --dump - http://localhost:8529/_api/collection <<EOF
{
"name" : "fleets"
}
EOF
下一个
arangosh [_system]> db._createEdgeCollection("relations");
转换为
curl -X POST --data-binary @- --dump - http://localhost:8529/_api/collection <<EOF
{
"name" : "relations", "type": 3
}
EOF
下一个
arangosh [_system]> db.fleets.save({ _key: "airline0", name: "Airline 0" });
转换为
curl -X POST --data-binary @- --dump - http://localhost:8529/_api/document?collection=products <<EOF
{ "_key": "airline0", "name": "Airline 0" }
EOF
下一个
db.relations.save("pilots/jennifer", "planes/plane0", { type: 'canfly' });
转换为
curl -X POST --data-binary @- --dump - http://localhost:8529/_api/edge/?collection=relations&from=pilots/jennifer&to=planes/plane0 <<EOF
{
"type" : "canfly"
}
EOF