在 OrientDB 中,每个顶点都有连接的边。这意味着可以通过使用嵌套的“选择”语句从集合中显式地遍历节点。
举个例子:给定一个节点属性的路径,找到匹配的结束节点。路径由节点属性列表组成(例如,kind
在路径中的节点中是唯一的)。
现在,假设我有一棵树:
kind=site, name=site1
-- kind=project, name=project1
-- kind=library, name=library1
kind=site, name=site2
-- kind=project, name=project2
-- kind=library, name=library1
用户希望从名为 library1 的库中获取信息,路径为:
[{kind=site},{kind=project,name=project1},{kind=library,name=library1}]
只要结果是单个节点,不让每个节点都完全符合遍历条件是可以的。
在 OrientDB 中,该过程将是:
- 从 kind=site 的所有节点开始
- 穿过“孩子”边缘并收集所有种类=项目和名称=项目1的对象
- 穿过子边缘并收集所有 kind=library 和 name=library1 的对象
这可以在嵌套的 select 语句中完成。kind 字段是索引的,因此可以从大量对象中快速收集起始节点。为了进一步提高性能,我知道哪些表(集合)中有哪些类型,因此我可以确定要从中选择的对象数量(从 <table> where kind=site 中选择)。
在 ArrangoDB 中,只有边有节点绑定信息,所以有一个节点我不能直接穿过连接的边。在 GRAPH_TRAVERSAL 函数中,我可以通过示例指定起始集合。所以这个例子是{kind=site}。这是否意味着必须通过扫描所有图形边来收集节点的起始列表,基本上是查看连接到整个图形中每个边的输入的每个节点?
如何制定这样的查询(在 AQL 和/或 arangojs 中),以便不必从对连接到边缘的对象进行全面扫描开始?
我也看不到如何将示例顶点发送到 arangojs 遍历函数中。它似乎总是想要一个明确的起始顶点。