在OrientDB中,每个顶点都有连接的连接边。这意味着可以使用嵌套的“ select”语句显式遍历集合中的节点。
例如:给定节点属性的路径,找到匹配的结束节点。路径由节点属性列表组成(例如,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中,过程将是:
这可以在嵌套的select语句中完成。对kind字段进行了索引,因此可以从大量对象中快速收集起始节点。为了进一步提高性能,我知道哪种表(集合)属于哪种类型,因此我可以确定要从中选择的对象的数量(从<table>选择,其中kind = site)。
在ArrangoDB中,只有边缘具有节点绑定信息,因此拥有节点我无法直接穿过连接的边缘。在GRAPH_TRAVERSAL函数中,我可以通过示例指定起始集合。因此,示例为{kind = site}。这不是意味着必须通过扫描所有图形边缘来收集节点的起始列表,基本上是查看连接到整个图形中每个边缘输入的每个节点吗?
这样的查询将如何制定(在AQL和/或arangojs中),这样就不必从对边缘连接的对象进行全面扫描开始了?
我也看不到如何将示例顶点发送到arangojs遍历函数中。似乎总是想要一个明确的起始顶点。
考虑到这样的工作,我们设计了新的AQL图形遍历,该遍历将与ArangoDB 2.8一起发布(当前处于beta后期)
关于您的最后一点,我们使用命名图来识别相关集合,这些图知道集合及其在图中的关系。我假设您将named graphs
因此使用。
让我们使用带有arangosh的ArangoDB 2.8示例图之一:
var examples = require("org/arangodb/graph-examples/example-graph.js");
var graph = examples.loadGraph("traversalGraph");
它在circles
集合中有其顶点,其边缘连接edges
集合中的顶点:
db.circles.toArray();
db.edges.toArray();
现在,我们可以将FILTER
语句与遍历深度结合使用,以在执行的早期修剪图分支的遍历。
在这里,我们对在遍历的第一层中找到的顶点的属性进行过滤:
db._query("FOR v, e, p IN 1..3 " +
"OUTBOUND 'circles/A' " +
"GRAPH 'traversalGraph' " +
"FILTER p.vertices[1]._key != 'G' RETURN v._key");
我们还可以通过类似的方式过滤边缘的属性:
db._query("FOR v, e, p IN 1..3 "
"OUTBOUND 'circles/A' " +
"GRAPH 'traversalGraph' " +
"FILTER p.edges[0].label != 'right_foo' RETURN v._key");
在AQL图的遍历章也有一个深入的解释,以何种方式横移走在曲线图。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句