限制命名图遍历中使用的边
Limit edges used on named graph traversal
问:我可以限制系统在 AQL 遍历命名图时尝试使用的边集合吗?
场景:
如果我有一个具有两个顶点集合和两个边集合的命名图 productGraph:
- 顶点:产品、价格
- prodParentOf(产品 A 是产品 B 的父级)
- prodHasPrice(产品 A 的价格为 $X)
如果现在我想要产品 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
子句是可选的。它对结果没有影响。如果你想从遍历中排除集合,你可以使用集合集而不是命名图,或者将 FILTER
与 IS_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}
将来可能会出现一种修剪路径的方法,这也应该有助于您的命名图场景。
问:我可以限制系统在 AQL 遍历命名图时尝试使用的边集合吗?
场景:
如果我有一个具有两个顶点集合和两个边集合的命名图 productGraph:
- 顶点:产品、价格
- prodParentOf(产品 A 是产品 B 的父级)
- prodHasPrice(产品 A 的价格为 $X)
如果现在我想要产品 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
子句是可选的。它对结果没有影响。如果你想从遍历中排除集合,你可以使用集合集而不是命名图,或者将 FILTER
与 IS_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}
将来可能会出现一种修剪路径的方法,这也应该有助于您的命名图场景。