代码之家  ›  专栏  ›  技术社区  ›  camba1

用于命名图遍历的极限边

  •  0
  • camba1  · 技术社区  · 6 年前

    问:我可以限制系统在遍历命名图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}
    

    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}
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   CodeManX    6 年前

    这个 WITH clause 不会对属于 将在遍历中使用命名图的。它主要用于集群中的遍历,以声明将涉及哪些集合。这有助于避免死锁,如果在查询运行时延迟锁定集合,则可能发生死锁。

    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}