关于理解 ArangoDB 中 Graph Creation 的必要性
Regarding understanding the necessity of Graph Creation in ArangoDB
我不明白在 ArangoDB 中创建图形的必要性。
例如参考下面的AQL,
// Paths between 2 vertices
FOR p IN TRAVERSAL(person, knows, "person/person3", "outbound", {
paths: true, filterVertices: [{_id: "person/person2"}],
vertexFilterMethod: ["exclude"]}) RETURN p.path.vertices[*].name
//All connected Vertices for a given Vertex..**
FOR p IN PATHS(person, knows, "outbound")
FILTER p.source._id == "person/person5"
RETURN p.vertices[*].name
以上两个查询显然与图形相关...但您无需创建图形即可使它们起作用。
为什么以及何时应该创建图表?
如果创建图表,我将获得哪些优势?
Creating or registering a 'graph' 在 ArangoDB 中是可选的。其目的是在修改期间保持图形持久性。
您可以在集合上使用文档特征和图遍历组合,而无需引用图。
但是,上述图形定义的一个主要目的是在修改边或顶点时使用它。一个顶点集合中的一个顶点文档可以被多个边集合中的多个边文档引用,这些边集合属于多个图。
当您现在 remove a vertex via a graph API 时,将询问所有这些图定义是否允许边指向这个非常特殊的顶点集合。随后搜索并删除所有可能的边集合中的所有边。所有这些都是通过事务安全完成的。
通过这样做,可以保持提到的图形持久性。图持久性意味着您没有指向先前删除的顶点的悬垂边。
请注意,您应该使用 pattern matching traversals;可以换一种说法
FOR p IN TRAVERSAL(person, knows, "person/person3", "outbound", {
paths: true, filterVertices: [{_id: "person/person2"}],
vertexFilterMethod: ["exclude"]}) RETURN p.path.vertices[*].name
像这样使用更现代的模式匹配:
FOR v, e, p IN 1..20 OUTBOUND "person/person3"
FILTER v._ID != "person/person2"
RETURN p.vertices[*].name
我不明白在 ArangoDB 中创建图形的必要性。
例如参考下面的AQL,
// Paths between 2 vertices
FOR p IN TRAVERSAL(person, knows, "person/person3", "outbound", {
paths: true, filterVertices: [{_id: "person/person2"}],
vertexFilterMethod: ["exclude"]}) RETURN p.path.vertices[*].name
//All connected Vertices for a given Vertex..**
FOR p IN PATHS(person, knows, "outbound")
FILTER p.source._id == "person/person5"
RETURN p.vertices[*].name
以上两个查询显然与图形相关...但您无需创建图形即可使它们起作用。
为什么以及何时应该创建图表?
如果创建图表,我将获得哪些优势?
Creating or registering a 'graph' 在 ArangoDB 中是可选的。其目的是在修改期间保持图形持久性。
您可以在集合上使用文档特征和图遍历组合,而无需引用图。
但是,上述图形定义的一个主要目的是在修改边或顶点时使用它。一个顶点集合中的一个顶点文档可以被多个边集合中的多个边文档引用,这些边集合属于多个图。
当您现在 remove a vertex via a graph API 时,将询问所有这些图定义是否允许边指向这个非常特殊的顶点集合。随后搜索并删除所有可能的边集合中的所有边。所有这些都是通过事务安全完成的。
通过这样做,可以保持提到的图形持久性。图持久性意味着您没有指向先前删除的顶点的悬垂边。
请注意,您应该使用 pattern matching traversals;可以换一种说法
FOR p IN TRAVERSAL(person, knows, "person/person3", "outbound", {
paths: true, filterVertices: [{_id: "person/person2"}],
vertexFilterMethod: ["exclude"]}) RETURN p.path.vertices[*].name
像这样使用更现代的模式匹配:
FOR v, e, p IN 1..20 OUTBOUND "person/person3"
FILTER v._ID != "person/person2"
RETURN p.vertices[*].name