CosmosDb 中的问题 运行 Gremlin 查询

Problem running Gremlin query in CosmosDb

我在 Azure CosmosDB 中 运行 这个 Gremlin 查询有问题。

g.V().
  has('node', 'id', 'new').
  fold().coalesce(
    unfold(),
    addV('node').
    property('id', 'new').
    property('partitionKey', 'edd1f6ca3b1c446987d7da29e370cc7e')
  ).V().
  has('node', 'id', 'new').
    as('new').
  V().
  has('node', 'id', 'root').
  coalesce(
    outE('contains').where(inV().as('new')),
    addE('contains').to('new')
  ).V().
  has('node', 'id', 'new').
    as('new').
  V().has('userGroup', 'id', 'userGroup1').
  coalesce(
    outE('hasAccess').where(inV().as('new')),
    addE('hasAccess').to('new')
  )

我遇到两个问题:

  1. 如果数据库中有许多其他节点 (350000),查询将超时。我无法在 TinkerPop 中对此进行测试。
  2. 没有创建 hasAccess 边缘。这适用于 TinkerPop。

查询的基础是(图片来自gremlify.com):

g.addV('node').
  property('id', 'root').
  property('partitionKey', '33cb2571f8e348eaa875e6a2639af385')
g.addV('userGroup').
  property('id', 'userGroup1').
  property('partitionKey', '1')

我想结束这样的事情:

一个查询可以 运行 多次而不改变任何东西(幂等)。如果我在单独的查询中执行此操作,它会正常工作:

g.V().
  has('node', 'id', 'new').
  fold().coalesce(
    unfold(),
    addV('node').
    property('id', 'new').
    property('partitionKey', 'edd1f6ca3b1c446987d7da29e370cc7e')
  )
g.V().
  has('node', 'id', 'new').
    as('new').
  V().
  has('node', 'id', 'root').
  coalesce(
    outE('contains').where(inV().as('new')),
    addE('contains').to('new')
  )
g.V().
  has('node', 'id', 'new').
    as('new').
  V().has('userGroup', 'id', 'userGroup1').
  coalesce(
    outE('hasAccess').where(inV().as('new')),
    addE('hasAccess').to('new')
  )

但我想保存对数据库的两次调用并一次性完成。

根据我的经验,在遍历中间使用 V() 步骤在某些供应商中没有得到很好的优化,即使后面跟着像 has('id', <name>) 这样的强大过滤器,我认为你应该尝试如果您想执行单个查询,请避免使用它。 你可以试试:

g.V().hasLabel('node', 'userGroup').has('_id', within('new', 'root', 'userGroup1')).
  fold().as('vertices').coalesce(
    unfold().has('node', '_id', 'new'),
    addV('node').property('_id', 'new').
    property('partitionKey', 'edd1f6ca3b1c446987d7da29e370cc7e')
  ).as('new').
  select('vertices').unfold().has('node', '_id', 'root').coalesce(
    outE('contains').where(inV().as('new')),
    addE('contains').to('new')
  ).
  select('vertices').unfold().has('userGroup', '_id', 'userGroup1')
  coalesce(
    outE('hasAccess').where(inV().as('new')),
    addE('hasAccess').to('new')
  )

示例:https://gremlify.com/pdtla2bsrc/1