首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

利用图遍历路径中位置未知的边和顶点进行ArangoDB主动队列滤波

在图遍历过程中,有时我们需要对路径中的边和顶点进行滤波,以减少不必要的计算或提高查询效率。ArangoDB 是一个支持图遍历的 NoSQL 数据库,它提供了 AQL(ArangoDB Query Language)和 Traversal API 来实现图遍历和滤波。

以下是一个利用 ArangoDB 主动队列进行图遍历路径中位置未知的边和顶点滤波的示例:

1. 创建图和集合

首先,我们需要创建一个图和相关的顶点/边集合。

代码语言:javascript
复制
-- 创建顶点集合
db._createVertexCollection("vertices");

-- 创建边集合
db._createEdgeCollection("edges");

-- 添加一些顶点和边
db.vertices.save({ _key: "A", type: "start" });
db.vertices.save({ _key: "B", type: "middle" });
db.vertices.save({ _key: "C", type: "end" });

db.edges.save("edges/A", "vertices/B", { label: "to_middle" });
db.edges.save("vertices/B", "vertices/C", { label: "to_end" });

2. 使用 Traversal API 进行图遍历和滤波

假设我们要从顶点 "A" 开始遍历,并且只关心那些标签为 "to_middle" 的边和类型为 "middle" 的顶点。

代码语言:javascript
复制
const arangojs = require('arangojs');
const { Database } = arangojs;

const db = new Database({ url: 'http://localhost:8529' });
db.useDatabase('your_database_name');
db.useBasicAuth('username', 'password');

async function traverseGraph() {
  const result = await db.traversal({
    startVertex: 'vertices/A',
    direction: 'outbound',
    edgeCollectionRestriction: ['edges'],
    vertexCollectionRestriction: ['vertices'],
    filter: (config, vertex, path) => {
      // 滤波条件:只关心标签为 "to_middle" 的边和类型为 "middle" 的顶点
      if (path.edges.length > 0 && path.edges[path.edges.length - 1].label === 'to_middle' && vertex.type === 'middle') {
        return true;
      }
      return false;
    },
    visitor: (vertex, path) => {
      console.log('Visited vertex:', vertex._key);
    }
  });

  console.log('Traversal result:', result);
}

traverseGraph().catch(console.error);

解释

  1. 创建图和集合:我们创建了一个简单的图,包含三个顶点和两条边。
  2. Traversal API
    • startVertex:指定遍历的起始顶点。
    • direction:指定遍历方向(outbound 表示从起始顶点向外遍历)。
    • edgeCollectionRestrictionvertexCollectionRestriction:限制遍历的边和顶点集合。
    • filter:自定义滤波函数,用于在遍历过程中进行条件判断。在这个例子中,我们只关心标签为 "to_middle" 的边和类型为 "middle" 的顶点。
    • visitor:遍历过程中访问每个符合条件的顶点时执行的回调函数。

通过这种方式,我们可以灵活地对图遍历路径中的边和顶点进行滤波,以满足特定的业务需求。

注意事项

  • 确保 ArangoDB 服务器和客户端库版本兼容。
  • 根据实际需求调整滤波条件和遍历逻辑。
  • 处理大规模图数据时,注意性能优化和索引的使用。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

ArangoDB 系列(1) —— 初识 ArnagoDB

集合管理命令 集合相关方法 数据库 AQL 语句执行 ArangoDB AQL 语法 插入数据 修改语句 删除语句 查询语句 遍历查询 前置知识 ArangoDB 特性 灵活数据类型,...支持键值对、文档(用于保存社会关系) 在运行对文档或者集合查询时,能够有选择保持事务一致性隔离性 具备复制与分片功能,能够对数据库进行失败配置,并且可以将大数据集分布在多个服务器上 可配置持久性...代表是自定义数据存储位置 ArangoDB 客户端安装与连接 # 上传 ArangoDB 客户端压缩包,然后解压 tar -xf arangodb3-client-linux-3.9.0.tar..._collection("Characters").drop() 数据库 # 创建顶点集合 db._create("vertex"); # 创建集合 db...._id); # 查看以某顶点为终点 db.relation.inEdges(myGraph.v2.

1.9K20

贪婪算法-单源最短路径

前言 感谢每一位朋友阅读与建议,今天对最短路径blog进行了修改,调整部分内容。感谢各位关注。提早祝大家圣诞节平安快乐。...单源最短路径问题描述 给定一个带权有向G=(V,E),其中每条权是一个实数。另外,还给定V一个顶点,称为源。现在要计算从源到其他所有各顶点最短路径长度。这里长度就是指路上各权之和。...算法描述 借助队列实现每条只访问一次。 初始情况下声明所有节点最短路径未知 起点s声明最短路径为0,并将s入队。...将起点放入队列队列取出节点v,更新v临接顶点集,针对每个v临接点w,若dv+cvw<dw,则更新w路径。...注:cvw为(v,w)权,dv,dw分别为v,w最短路径 当w不在队列时,将w放入队列 直到队列为空为止 核心代码 /** * 有权有负值最短路径 * 借助广度优先搜素 * @param

1.1K50
  • 如何去伪存真地看懂一份数据库评测报告?

    面向高维数据操作,这也是本文关注重点,例如面向全或子数据查询结果返回多个顶点组合而成高维数据结构,可能是多顶点集合、点构成路径、子(子网)甚至是全遍历结果。...在此,我们做个明确说明,无论以何种方式进行高维查询,数据库操作无外乎遵循如下3种遍历模式: 广度优先(BFS):例如K邻查询、最短路径就是典型广度优先遍历模式。...ArangoDB原生支持ARM架构。...; 查询方式错误:只进行了单向查询,没有进行双向遍历查询; 查询代码实现错误:即没有对结果进行有效去重——这个我们在多跳K-hop查询再继续分析。...10 Tigergraph进行单向遍历错误2nd-Hop结果 遗憾是,Tigergraph查询结果错误问题在今天数据库市场并不是个例,我们在Neo4j、ArangoDB等系统也发现因底层实现或接口调用等问题而出现错误

    1K30

    数据结构与算法——最短路径

    2 重要概念 路径G =,从任一顶点开始,由或弧邻接至关系构成有限长顶点序列称为路径。   ...简单路径:除第一个最后一个顶点外,路径无其它重复出现顶点,称为简单路径。 回路或环:路径第一个顶点最后一个顶点相同时,称为回路或环。...4.2 算法流程   (1)将所有的顶点分为两部分:已知最短路程顶点集合P未知最短路径顶点集合Q。最开始,已知最短路径顶点集合P只有源点s一个顶点。...因此,选择顶点2加入集合P,令book[2]=1。顶点2加入后,需要考虑经过顶点2进行中转,使得顶点1到达其余顶点距离发生改变。顶点2。...(2)读取队列顶点,并将头顶点u出队列,将与u邻接所有顶点v进行松弛,若v没有在队列,则将邻接顶点v入队列。如果已经在队列,则不再入队。   (3)队列为空时,单源最短路径查找完毕。

    4.6K40

    数据结构与算法: 三十张弄懂「两种遍历方式」

    ,按照某种搜索方法沿着访问图中所有顶点,使每个顶点仅被访问一次,这个过程称为遍历。...遍历过程得到顶点序列称为遍历序列。   ...当采用邻接表存储时,邻接表只是存储了结点(e条,无向也只是2e个结点),加上表头结点为n(也就是顶点个数),因此时间复杂度为O(n+e)。...3.3.1.1 (1)选取A为起始点,输出A,A入队列,标记A,当前位置指向A。 (2)队列头为A,A出队列。A邻接顶点有B、E,输出BE,将BE入队,并标记B、E。当前位置指向A。...3.4 算法分析   假设有V个顶点,E条,广度优先搜索算法需要搜索V个节点,时间消耗是O(V),在搜索过程,又需要根据来增加队列长度,于是这里需要消耗O(E),总得来说,效率大约是O(V+E

    1.2K20

    数据结构高频面试题-

    带权有向最短路径长度:源点Vm到终点Vn所有路径,权值最小路径是最短路径,其长度是最短路径长度。 完全:任意两个顶点都相连称为完全,又分为无向完全有向完全。...初始化入度为 0 集合需要遍历整张,具体做法是检查每个结点每条,因此复杂度为 O(E+V),然后对该集合进行操作,又需要遍历整张图中每个结点每条,复杂度也为 O(E+V); 空间复杂度:O...对每个equation如"a/b=v"构造a到b带权v有向b到a带权1/v有向, 之后对每个query,只需要进行dfs并将路径权重叠乘就是结果了,如果路径不可达则结果为-1。...[from, to],子数组两个成员分别表示飞机出发降落机场地点,对该行程进行重新规划排序。...附加两个顶点包含在1到N中间,这条附加不属于树已存在。 结果是一个以组成二维数组。每一个元素是一对[u, v] ,满足 u < v,表示连接顶点u v无向

    2.2K20

    数据结构-结构

    G每一条都有方向,则称G为有向常见术语 顶点度 依附于某顶点v数称为该顶点度,记作TD(v)。 有向图中还有入度出度概念。...对于非连通,则需要分别从不同连通分量顶点出发进行搜索,才能访问到图中所有顶点。 对于有向,若图中一对顶点之间有双向路径,则称这两点之间是连通。...顶点域data用来存放顶点数据信息 指针域firstArc指向依附于该顶点第1条。 通常将一个**n**个顶点节点放到一个数组中进行管理,并用该数组下标表示顶点在图中位置。...next是指针域,指向下一个节点。最后一个节点next域为null 邻接表由一个顶点数组一组链表组成。 顶点数组存放顶点信息,链表存放信息。...在遍历过程,可能存在一些额外操作,比如计算带权有向权之和,计算两顶点之间路径距离等。 这些操作都必须依赖遍历来实现,仅靠访问图中每个顶点是无法实现

    33820

    数据结构考研面试被问问题_考研程序设计与数据结构

    层次遍历 从根结点第一层开始访问 从上到下进行遍历, 从左到右访问结点 (利用队列来实现) 树遍历 先跟遍历: 先访问根结点 从左到右先跟遍历每个子树 后跟遍历: 先依次后跟遍历每根子树, 然后再访问根结点...存储结构 邻接表:(链式存储结构)由单链表表头形成顶点表,单链表其余结点形成表两部分组成;一般顶点表存放顶点信息指向第一个结点指针 邻接矩阵:(顺序存储结构) 有向十字链表法 无向多重链表法...1.从候选挑选出最小输出,并将于该另一端顶点并入树 2.考查所有剩余顶点,选取与这棵树相接最短 时间复杂度为O(n2),适用于稠密 克鲁斯卡尔算法 思路: 每次找出后候选权值最小...拓扑算法核心 过程: 从有向图中选择一个没有前驱(入读为0)顶点输出 删除1顶点,并且删除从该顶点发出全部 一直重复 若图中没有环时候,还可采用深度优先搜索遍历方法进行拓扑排序 关键路径相关概念...AOE网——对于活动在边上我网 AOVAOE区别 相同点: 都是无环 不同点:AOV活动在顶点无权值,代表活动之前先后关系, AOE活动在有权值,代表活动持续时间 关键路径核心算法

    62710

    定义 是由顶点有穷非空集合顶点之间集合组成,通常表示为: G=(V,E) 其中:G表示一个,V是G顶点集合,E是G顶点之间集合。 图中可以没有边但必须有点。...路径长度:不带权路径上边个数,带权图中为路径上边权值之和, 回路:起点与终点相同路径,包括环。 简单路径,简单回路:除了第一个顶点最后一个顶点,剩下顶点没有重复。...深度遍历方式 利用栈可以进行深度遍历。...基本思想就是将一个节点压入栈,然后在判断与其邻接节点中有没有未被访问节点,有的话就将此节点压入栈,访问之后节点要对其进行标记防止其二次访问,每次都对栈顶元素进行判定是否还有未访问邻接节点,若是全部访问...广度遍历方式 利用队列可以进行广度遍历,就是将一个节点入队,然后输出队首元素值,将与队首元素相连所有未被访问邻接节点入队,队首元素出队,不断进行操作,知道队列为空,就完成了广度遍历

    15910

    C语言结构总结(一)

    [TD(V)=ID(V)+OD(V)] 路径:从 V1 到 V2 能走路。 路径长度:路径或弧数目。 环 (回路):第一个顶点到最后一个顶点相同路径。...简单环:除首尾顶点(相同一个顶点)外其余顶点不重复出现环。 连通:V1 到 V2 有路径,则 V1 V2 是连通。 连通 / 强连通:图中任意顶点 Vi Vj 都是连通。...)应当最少; 对下一步位置权重集合进行非递减排序(可以有重复值递增排序); 然后按照这个排序结果遍历,就可以少很多次递归。...\n"); } free(data); return 0; } # 广度优先遍历 利用队列,每次把上一顶点所有可选下一顶点依次排入队列,然后按照这个队列依次访问,类似树层级遍历。...若一个未被遍历顶点( 白色顶点 )与多条 紫色 相连,则只保留权值最小 紫色 ,其余 紫色 弃掉 4. 将 紫色 权值最小那条涂为 红色 ,与其相连顶点连入生成树 5.

    1.9K20

    数据结构面试常见问题总结怎么写_前端数据结构与算法面试题

    A: 头指针:是指向第一个节点存储位置指针 头结点:是放在第一个元素节点之前,便于在第一个元素节点之前进行插入删除操作 Q:栈队列区别 A:栈队列都是操作受限线性表 栈:只能在栈尾入栈、出栈...A: Prim(普里姆)算法:在图中取任意顶点 v 作为起始顶点,并加入集合 V;之后遍历与 V 顶点相邻,选择权值最小且顶点未加入集合 V ,把其加入集合 V,直到集合 V 包含所有顶点结束...邻接表:适合稀疏,节省空间,容易找出邻边,确定两个顶点间是否存在花费时间代价大 Q:树存储结构 A:双亲表示法、孩子表示法、孩子兄弟表示法 Q: 遍历遍历有哪些 A: 遍历:广度优先遍历...,一个区间全部比基准值小,另一个区间全部比基准值大,接着再选取一个基准值来进行排序,以此类推,最后得到一个有序数列 Q:关键路径关键活动 A:关键路径是项目中时间最长活动顺序,决定着可能项目最短工期...,可能有 1 条或多条 Q:关键路径是用什么数据结构实现 A:有向无环 Q:排序算法介绍 A: 冒泡排序:从左到右依次比较相邻两个元素,如果前一个元素比较大,就把前一个元素后一个交换位置,重复地进行直到没有再需要交换

    59720

    【数据结构】

    其实有两种方式可以存储顶点顶点之间关系,一种就是利用二维矩阵(二维数组),某一个点其他另外所有点连接关系权值都可以通过二维矩阵来存储,另一种就是邻接表,类似于哈希表存储方式,数组存储每一个顶点...邻接矩阵来实现其实要方便许多,添加顶点之间关系时,只需要更改矩阵对应位置存储值即可,而无需向邻接表似的还需要额外添加顶点,不过邻接矩阵邻接表相比各有优劣,对于稠密,也就是图中数量很多,这种就适合用邻接矩阵来存储...,所以只要元素一入队列那就直接将该元素在visited位置写为true即可。...,其实选过程是非常头疼,因为每次选都需要依次遍历已选择顶点集合中所有的点,将每个点作为起点连接到未选择顶点集合所有点,相当于要遍历m×n次,mn分别代表两个集合顶点个数,等到选择一半时候...,那些没有被更改存储权值结点就不需要入队列了,因为这些顶点现存值其实就已经是最短路径权值了,这样在每次循环时,就不需要无脑遍历所有顶点作为起始点进行松弛更新了,这样也可以进行优化。

    11010

    数据结构面试常见问题总结

    A: 头指针:是指向第一个节点存储位置指针 头结点:是放在第一个元素节点之前,便于在第一个元素节点之前进行插入删除操作 Q:栈队列区别 A:栈队列都是操作受限线性表 栈:只能在栈尾入栈、出栈...A: Prim(普里姆)算法:在图中取任意顶点 v 作为起始顶点,并加入集合 V;之后遍历与 V 顶点相邻,选择权值最小且顶点未加入集合 V ,把其加入集合 V,直到集合 V 包含所有顶点结束...邻接表:适合稀疏,节省空间,容易找出邻边,确定两个顶点间是否存在花费时间代价大 Q:树存储结构 A:双亲表示法、孩子表示法、孩子兄弟表示法 Q: 遍历遍历有哪些 A: 遍历:广度优先遍历...,一个区间全部比基准值小,另一个区间全部比基准值大,接着再选取一个基准值来进行排序,以此类推,最后得到一个有序数列 Q:关键路径关键活动 A:关键路径是项目中时间最长活动顺序,决定着可能项目最短工期...,可能有 1 条或多条 Q:关键路径是用什么数据结构实现 A:有向无环 Q:排序算法介绍 A: 冒泡排序:从左到右依次比较相邻两个元素,如果前一个元素比较大,就把前一个元素后一个交换位置,重复地进行直到没有再需要交换

    90330

    数据结构

    处理散列表冲突(冲突原因:同一个位置只能存放一个值) 分离链接:为散列表每一个位置都创建一个链表并将元素存放在里面。...线性探查:当新元素加入列表时,如果索引为index位置已被占据,则尝试index+1位置,依次类推,已找到空位置未知。...是一种网络抽象模型,它是一组由连接节点(或顶点),任何二元关系都可以用来表示。...,列表示 #遍历 #广度优先搜索(BFS) 队列实现:通过将顶点存入队列,最先入队列顶线先被搜索。...简单理解:就是一层一层访问遍历,走完为止。 #深度优先搜索(DFS) 栈实现:通过将顶点粗存入栈顶点沿着路径被探索,存在新相邻顶点就去访问。

    83710

    从 0 开始学习 JavaScript 数据结构与算法(十二)

    下面这是个抽象出来 ? 顶点 顶点刚才我们已经介绍过了,表示图中一个结点。 比如地铁站某个站/多个村庄某个村庄/互联网某台主机/人际关系的人。 表示顶点顶点之间连线。...比如地铁站两个站点之间直接连线, 就是一个。 注意:这里不要叫做路径路径有其他概念,后面会区分。 相邻顶点 由一条连接在一起顶点称为相邻顶点。...回路:第一个顶点最后一个顶点相同路径称为回路。比如 0 1 5 6 3 0。 无向 上面的就是一张无向,因为所有的都没有方向。...其他数据结构一样,需要通过某种算法来遍历结构每一个数据。...两种算法思想 BFS 基于队列,入队列顶点先被探索。 DFS 基于栈,通过将顶点存入栈顶点是沿着路径被探索,存在新相邻顶点就去访问。

    68020

    最短路径算法–无向

    1、表示数据结构 邻接列表 邻接列表:在邻接列表实现,每一个顶点会存储一个从它这里开始列表。...比如,如果顶点A 有一条到B、CD,那么A列表中会有3条 邻接列表只描述了指向外部。A 有一条到B,但是B没有边到A,所以 A没有出现在B邻接列表。...邻接矩阵 邻接矩阵:在邻接矩阵实现,由行列都表示顶点,由两个顶点所决定矩阵对应元素表示这里两个顶点是否相连、如果相连这个值表示是相连权重。...例如,如果从顶点A到顶点B有一条权重为 5.6 ,那么矩阵第A行第B列位置元素值应该是5.6: 、、 邻接矩阵存储方式是用两个数组来表示。...然后,在一个while循环中,从队列中弹出顶点遍历顶点邻接点,若该邻接点距离未被更新过(表示该邻接点未被访问过),更新邻接点最短路径距离为 该顶点距离加上1,并将所有的邻接点入队列

    1K20

    数据结构

    45.png 自环:即一条链接一个顶点自身 平行:连接同一对顶点两条 52.png 分类 无向: 没有方向称为无向作用仅仅是连接两个顶点,没有其他含义 有向: 不仅连接两个顶点...:是依附于这个顶点个数 子:一幅图中,所有边子集组成,包含这些依附顶点 路径:是由顺序链接一系列顶点组成 环:至少含有一条,且终点起来相同路径 连通:如果图中任意一个顶点都存在一条路径到达另外一个顶点...,那么这幅就称为连通 连通子:组成连通非连通 48.png 欧拉七桥 欧拉开创了新学科:图论 49.png 存储结构 是由顶点构成,所以在图里边,要存储图形结构信息,无非就是存储顶点...,并且要跳过已经探索顶点 遍历完这个顶点以后,将这个顶点标志为已经探索 循环在队列探索下一个顶点 深度优先遍历过程 广度优先使用队列,深度优先原理:使用递归 从某一个顶点开始查找,并且将这个顶点标记为已经发现...(灰色) 从这个顶点开始探索其他全部顶点,并且跳过已经发现顶点 递归返回,继续探索下一个路径最深顶点 代码案例 利用邻接矩阵(数组)创建 let scanf = require('scanf

    92220

    PHP数据结构(九) ——定义、存储与两种方式遍历

    3、有向:由顶点弧组成;无向:由顶点组成。 4、完全有向:n个顶点有n(n-1)个弧;完全无向:n个顶点有n(n-1)/2个。...7、子顶点都被含于另一个,则该是另一个。...12、路径是指从顶点A经过若干或弧抵达顶点B,经过或弧数目称为路径长度,起止点相同路径称为回路或环。...3)有两种方式进行遍历,深度优先搜索广度优先搜索。...3、广度优先算法:采用队列(先进先出FIFO)思想,遍历节点时,被遍历节点出队列,再遍历其子节点。关键要点深度优先算法类似。 PHP源码如下: <?

    1.9K80

    数据结构

    45.png 自环:即一条链接一个顶点自身 平行:连接同一对顶点两条 52.png 分类 无向: 没有方向称为无向作用仅仅是连接两个顶点,没有其他含义 有向: 不仅连接两个顶点...:是依附于这个顶点个数 子:一幅图中,所有边子集组成,包含这些依附顶点 路径:是由顺序链接一系列顶点组成 环:至少含有一条,且终点起来相同路径 连通:如果图中任意一个顶点都存在一条路径到达另外一个顶点...,那么这幅就称为连通 连通子:组成连通非连通 48.png 欧拉七桥 欧拉开创了新学科:图论 49.png 存储结构 是由顶点构成,所以在图里边,要存储图形结构信息,无非就是存储顶点...,并且要跳过已经探索顶点 遍历完这个顶点以后,将这个顶点标志为已经探索 循环在队列探索下一个顶点 深度优先遍历过程 广度优先使用队列,深度优先原理:使用递归 从某一个顶点开始查找,并且将这个顶点标记为已经发现...(灰色) 从这个顶点开始探索其他全部顶点,并且跳过已经发现顶点 递归返回,继续探索下一个路径最深顶点 代码案例 利用邻接矩阵(数组)创建 let scanf = require('scanf

    1.1K20

    数据分析学习之不得不知八大算法详解

    它沿着树深度遍历节点,尽可能深搜索树分 支。当节点 v 所有边都己被探寻过,搜索将回溯到发现节点 v 那条起始节点。 这一过程一直进行到已发现从源节点可达所有节点为止。...深度优先搜索是图论经典算法,利用深度优先搜索算法可以产生目标图相应拓扑排序表,利用拓扑排序表可以方便解决很多相关图论问题,如最大路径问题等等。一般用堆数据结构来辅助实现 DFS 算法。...算法步骤: 访问顶点 v; 依次从 v 未被访问邻接点出发,对进行深度优先遍历;直至图中和 v 有路径相通顶点都被访问; 若此时图中尚有顶点未被访问,则从一个未被访问顶点出发,重新进行深度优先遍历...简单说,BFS 是从根节点开始,沿着树 () 宽度遍历树 () 节点。如果所有节点均被访问,则算法中止。BFS 同样属于盲目搜索。一般用队列数据结构来辅助实现 BFS 算法。...该算法输入包含了一个有权重有向 G,以及 G 一个来源顶点 S。我们以 V 表示 G 中所有顶点集合。每一个图中,都是两个顶点所形成有序元素对。

    69120
    领券