Graph arangodb aql有效地从startvertex到endvertex转换,并找到它们之间的连接

Graph arangodb aql有效地从startvertex到endvertex转换,并找到它们之间的连接,graph,arangodb,aql,Graph,Arangodb,Aql,我对图形概念和arangodb非常陌生。我计划在一个与沟通分析相关的项目中使用这两种方法。我已将数据设置为符合arangodb的需要,其中一个文档集合名为object,另一个边缘集合名为object\u routing 在my对象中的数据结构如下 { "img": "assets/img/default_message.png", "label": "some label", "obj_id": "45a92a7344ee4f758841b5466c010ed9", "type"

我对图形概念和arangodb非常陌生。我计划在一个与沟通分析相关的项目中使用这两种方法。我已将数据设置为符合arangodb的需要,其中一个文档集合名为
object
,另一个边缘集合名为
object\u routing

在my
对象中
的数据结构如下

{
  "img": "assets/img/default_message.png",
  "label": "some label",
  "obj_id": "45a92a7344ee4f758841b5466c010ed9",
  "type": "message"
}
...
{
  "img": "assets/img/default_person.png",
  "label": "some label",
  "obj_id": "45a92a7344ee4f758841b5466c01111",
  "type": "user"
}
{
  "message_id": "no_data",
  "source": "45a92a7344ee4f758841b5466c010ed9",
  "target": "45a92a7344ee4f758841b5466c01111",
  "type": "has_contacted"
}
在my
object\u routing
中,数据结构如下

{
  "img": "assets/img/default_message.png",
  "label": "some label",
  "obj_id": "45a92a7344ee4f758841b5466c010ed9",
  "type": "message"
}
...
{
  "img": "assets/img/default_person.png",
  "label": "some label",
  "obj_id": "45a92a7344ee4f758841b5466c01111",
  "type": "user"
}
{
  "message_id": "no_data",
  "source": "45a92a7344ee4f758841b5466c010ed9",
  "target": "45a92a7344ee4f758841b5466c01111",
  "type": "has_contacted"
}
通过
\u从:object/45A92A7344EE4F75884B5466C010ED9
\u到:object/45A92A7344EE4F75884B5466C01111

对象
的数据之和为23k,
对象路由
的数据之和为127k

我的问题是,我怎样才能有效地从起始顶点到结束顶点进行遍历,这样我就可以得到所有连接的顶点,它的边,它的子顶点等等,直到没有什么可以再次遍历为止

恐怕我的问题不够清楚,我对图形概念的理解也不正确,所以请耐心听我说


注意:bfs算法不是一个选项,因为这不是我需要的。如果可能的话,我想得到最长的路径。我的arangodb当前版本是3.1.7,运行在一个具有1个协调器和3个db服务器的集群上

值得尝试一些查询,以了解AQL遍历是如何工作的,但可以从AQL遍历文档页面的以下示例开始:

FOR v, e, p IN 1..10 OUTBOUND 'object/45a92a7344ee4f758841b5466c010ed9' GRAPH 'insert_my_graph_name'
  LET last_vertex_in_path = LAST(p.vertices)
  FILTER last_vertex_in_path.obj_id == '45a92a7344ee4f758841b5466c01111'
  RETURN p
此示例查询将查看名为
insert_my_graph_name
的图形中的所有出站边,从id为
object/45a92a7344ee4f758841b5466c010ed9
的顶点开始

然后设置查询,为找到的每个路径返回三个变量:

  • v
    包含找到的出站路径的顶点集合
  • e
    包含找到的出站路径的边集合
  • p
    包含找到的路径
路径由通过边相互连接的顶点组成

如果要探索变量,请尝试以下版本的查询:

FOR v, e, p IN 1..10 OUTBOUND 'object/45a92a7344ee4f758841b5466c010ed9' GRAPH 'insert_my_graph_name'
  RETURN {
    vertices: v,
    edges: e,
    paths: p
  }
好的是AQL以JSON格式、数组等形式返回这些信息

当返回路径时,它被存储为具有两个属性的文档,
顶点
,其中
属性是边文档的数组,路径向下移动,
顶点
属性是顶点文档的数组

关于
顶点
数组,有趣的是数组元素的顺序很重要。
顶点
数组中的第一个文档是起始顶点,最后一个文档是结束顶点

因此,上面的示例查询,因为您的查询设置为
出站
查询,这意味着您的起始顶点将始终是存储在
p.vertices'的数组的
第一个
元素,而路径的末端将始终是该数组的
最后一个`元素

无论在路径中遍历多少个顶点,该规则仍然有效

如果您的查询是
入站
规则,则逻辑保持不变,在这种情况下,
第一个(p.vertices)
将是路径的起始顶点,
最后一个(p.vertices)
将是终止顶点,与您在查询中指定的
\u id
相同

所以回到您的用例。。如果要筛选出从起始顶点到特定顶点的所有
出站
路径,则可以添加
LET last\u vertex\u in\u path=last(p.vertexs)
声明,以设置对所提供路径中最后一个顶点的引用

然后,您可以轻松提供引用此变量的
过滤器
,然后对该终止顶点的任何属性进行过滤。您可以在\u路径中的
last\u vertex\u.\u id
last\u vertex\u in\u path.obj\u id
或该最终顶点文档的任何其他参数上进行筛选

玩它并练习一些,但是一旦你看到一个图遍历查询只提供了这三个关键变量,
v
e
,和
p
,它们没有什么特别之处,它们只是顶点和边的数组,那么你就可以做一些非常强大的过滤了

您可以在任何顶点、边或路径位置的属性上设置过滤器,以对其发送的结果进行非常灵活的过滤和聚合

还可以查看遍历选项,它们可能很有用

要开始,请确保已加载文档和边,并且已创建了包含这些文档和边集合的图形

是的。。在一个图中可以有许多文档和边集合,如果适合您的用例,甚至可以在多个图中共享文档/边集合


玩得开心

查询遍历的结果是什么?要查找两个顶点之间的所有可能边,还是所有可能的顶点?请查看ArangoDB网站,看看这是否有帮助。该命令将为您提供一个顶点文档数组和一个边文档数组。您仍然可以使用类似“过滤最后一个(顶点)”的内容过滤该结果。obj_id=='something'
其中顶点数组的
LAST
值将是
入站
遍历路径的原始顶点。你需要什么?嗨@DavidThomas很抱歉回复太晚,我认为这是“找到两个顶点之间所有可能的边”,这样我也可以在给定的两个顶点之间找到所有可能的连接顶点,不是吗?我想要的输出是两个给定节点之间所有连接的顶点和边,这样我就可以用结果绘制图,并希望告诉最终用户如果两个给定的顶点是som