【问题标题】:Create Vertex only if "from" and "to" vertex exists仅当“from”和“to”顶点存在时才创建顶点
【发布时间】:2020-09-16 21:08:57
【问题描述】:

我想在单个查询中创建 1000 多个边。 目前,我正在使用 AWS Neptune 数据库和 gremlin.net 来创建它。 我面临的问题与速度有关。由于 HTTP 请求,它花费了大量时间。 所以我打算将我的所有查询组合成一个字符串并一次性执行。

_g.AddE("allow").From(_g.V().HasLabel('person').Has('name', 'name1')).To(_g.V().HasLabel('phone').Where(__.Out().Has('sensor', 'nfc'))).Next();

“To”(目标)顶点可能在数据库中不可用。在这种情况下,此查询也会失败。因此,在使用 hasNext() 执行此查询之前,我必须检查该顶点是否存在。

所以到目前为止它工作正常,但是当我考虑一次组合所有 1000 多个边缘创建时,是否可以编写一个不会中断的查询 "To"(目标)没有找到顶点?

【问题讨论】:

    标签: gremlin amazon-neptune gremlinnet


    【解决方案1】:

    您应该考虑对每个顶点使用Element Existence pattern,如 TinkerPop 食谱中所示。

    在您的示例中,您将替换查询的这一部分:

    _g.V().HasLabel('person').Has('name', 'name1')
    

    类似这样的东西(我没有 .NET 环境来测试语法):

    __.V().Has('person', 'name', 'name1').Fold().
    coalesce(__.Unfold(), __.AddV('person').Property('name', 'name1')
    

    这将作为一个 Upsert 并返回现有顶点或使用 name 属性添加一个新顶点。然后可以在 To 步骤中使用相同的模式,以确保它在创建边缘之前也存在。

    【讨论】:

    • 如果不存在,我不想创建顶点。如果两个顶点都存在,我只想创建边缘,否则只需跳过它。这也是我想为多个顶点创建这样的查询并立即执行。
    • 您是尝试从同一个开始/结束位置创建多个边,还是边之间的开始/结束位置会发生变化?
    • 开始位置不变,但结束位置会改变。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 2018-02-12
    • 2016-05-30
    • 2016-03-24
    • 2018-07-29
    • 1970-01-01
    相关资源
    最近更新 更多