限制命名图遍历中使用的边

Limit edges used on named graph traversal

问:我可以限制系统在 AQL 遍历命名图时尝试使用的边集合吗?

场景:

如果我有一个具有两个顶点集合和两个边集合的命名图 productGraph:

如果现在我想要产品 A 的子产品(没有价格),我想做这样的事情

WITH product
FOR v, e, p IN OUTBOUND 'product/A'
GRAPH 'productGraph'
RETURN {vertice:v, edge:e, path: p}

但是,如果我查看解释计划,我会发现系统试图对 prodParentOf 和 prodHasPrice 使用索引(即使我明确地将产品集合放在 'With' 子句中):

Indexes used:
 By   Type   Collection     Unique   Sparse   Selectivity   Fields               Ranges
  2   edge   prodHasPrice   false    false        75.00 %   [ `_from`, `_to` ]   base OUTBOUND
  2   edge   prodParentOf   false    false        65.37 %   [ `_from`, `_to` ]   base OUTBOUND

我可以限制系统在查询命名图时尝试使用的边集合吗?或者我是否必须在查询中使用边缘集合。 (在我看来,这意味着一般遍历边集合比命名图更好)。

这是使用边集合的相同查询

FOR v, e, p IN OUTBOUND 'product/A'
prodParentOf
RETURN {vertice:v, edge:e, path: p}

WITH clause不限制哪些集合属于 您命名的图形将用于遍历。主要是针对cluster中的遍历,声明会涉及到哪些集合。这有助于避免死锁,如果在查询运行时延迟锁定集合,可能会发生死锁。

如果您使用单个服务器实例,则 WTIH 子句是可选的。它对结果没有影响。如果你想从遍历中排除集合,你可以使用集合集而不是命名图,或者将 FILTERIS_SAME_COLLECTION() 一起使用。使用集合集合更有效,因为边集合越少,要遍历的边就越少,而过滤器在大多数情况下是在遍历之后应用的。

FOR v, e, p IN 1..5 OUTBOUND 'verts/start' GRAPH 'named-graph'
  FILTER (FOR id IN p.edges[*]._id RETURN IS_SAME_COLLECTION('edgesX', id)) ALL == true
  RETURN p

如果你的遍历深度只有1,那么过滤查询就更简单了:

FOR v, e, p IN INBOUND 'product/A' GRAPH 'productGraph'
  FILTER IS_SAME_COLLECTION('prodParentOf', e)
  RETURN {vertex: v, edge: e, path: p}

将来可能会出现一种修剪路径的方法,这也应该有助于您的命名图场景。