【问题标题】:Arangodb: can I use a subquery to determine starting node for graph traversalArangodb:我可以使用子查询来确定图遍历的起始节点吗
【发布时间】:2019-08-11 14:15:26
【问题描述】:

我正在使用 arangodb 构建权限系统。

我想使用子查询来确定图遍历的起始节点。这是我尝试过的

FOR vert IN 1..5
  OUTBOUND (
    FOR v, e, p IN 1..2
      OUTBOUND 'users/jill'
      GranterGrant, GrantGrantee
      FILTER e.edgeType == 'GrantGrantee' 
        AND v.type == 'User' 
        AND v._id == 'users/jim'
      LIMIT 1
      RETURN p.vertices[1]
  )
  RolePrivilege, GrantRole, GrantPrivilege
  FILTER vert.type == 'Privilege' 
    AND vert._id == 'privileges/JournalRead'
  LIMIT 1
  RETURN vert._id

内部查询是为了找到从jilljim的权限授予节点,外部查询确定是否存在从授予节点到权限JournalRead的路径

子查询在单独运行时工作,并返回一个我想用作外部查询起始节点的顶点。如果我对起始节点进行硬编码,则外部查询有效。

但是,当我运行上面的整个查询时,arango 会响应

Warnings:

[10], 'Invalid input for traversal: Only id strings or objects with _id are allowed'

Result:

[]

注意,我还在子查询中尝试了RETURN p.vertices[1]._id,结果相同。

那么,是否可以使用子查询来确定图遍历的起始节点?

【问题讨论】:

    标签: subquery arangodb


    【解决方案1】:

    您可以先获取起始节点列表并将它们分配给变量而不是使用子查询。 所以在你的情况下,它会是这样的:

    let initialNodes = (
        FOR v, e, p IN 1..2
          OUTBOUND 'users/jill'
          GranterGrant, GrantGrantee
          FILTER e.edgeType == 'GrantGrantee' 
            AND v.type == 'User' 
            AND v._id == 'users/jim'
          LIMIT 1
          RETURN p.vertices[1]
      )
    FOR initialNode IN initialNodes
      FOR vert IN 1..5
        OUTBOUND initialNode
        RolePrivilege, GrantRole, GrantPrivilege
        FILTER vert.type == 'Privilege' 
          AND vert._id == 'privileges/JournalRead'
        LIMIT 1
        RETURN vert._id
    

    请注意,您不限于单个初始节点。如果需要,您可以在子查询中返回多个。

    【讨论】:

    • 只是为了添加到这个答案,因为子查询返回顶点,所以避免在查询中使用路径 p 进行优化。它看起来像这样 FOR v, e IN 1..2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多