【问题标题】:Add edge if not exist using gremlin In Python如果不存在,则在 Python 中使用 gremlin 添加边缘
【发布时间】:2019-10-01 22:44:28
【问题描述】:

现在我正在尝试使用 python 为 aws 的 neptunedb 实现一些 gremlin 逻辑。我要检查一个边是否存在,如果存在则忽略,否则添加边。

对于 gremlin 控制台,我们可以这样做:

g.V().has('people','name', 'somebody').as('v').V().has('software','name','ripple').coalesce(__.inE('Created').where(outV().as('v')), addE('created').from('v').property('weight',0.5))

但我有点迷失了如何将其转换为 python。似乎python无法识别为('v')? 任何提示?或者我在哪里可以找到 gremlin python 的参考文档。

【问题讨论】:

标签: python gremlin amazon-neptune


【解决方案1】:

来自TinkerPop Gremlin documentation

as 一词在 Python 中是保留字,因此在 Gremlin 中必须使用 as_() 来引用。

from 的情况相同。只需将 as 替换为 as_ 并将 from 替换为 from_ 即可。

【讨论】:

  • 另外g.V().has('people','name', 'somebody')应该改成g.V().hasLabel(people).has('name', 'somebody')吧?
  • 一个这个,如果我想用id,我应该用T吗?喜欢g.V().hasLabel(people).has(T.id, 'somebody')
  • 对于您的第一条评论,这不是必需的 - has() 将接受标签作为第一个参数:“has(label, key, value): 如果元素没有,则删除遍历器指定的标签和提供的键/值属性。”。我想你可能想要 hasIds() 来检查 id,仔细查看 has() tinkerpop.apache.org/docs/current/reference/#has-step 的文档。
  • 1.这两个查询是一样的吗?如果是这样,它们在性能上有什么区别吗? 2.实际上我想问如何检查一个顶点是否存在,如果我通过带有标题"~id, ~label"的csv转储顶点。我可以像g.V().has('people', id, 'somebody')g.V().has('people',T.id, 'somebody')g.V().has('people','id', 'somebody') 一样检查它吗?实际上,我对 neptunedb 中的 id 有点困惑
【解决方案2】:

只是说清楚一点,对于python你需要做以下事情:

g.V().has('people','name', 'somebody').\
    as_('v').V().has('software','name','ripple').coalesce(
    __.inE('Created').where(__.outV().as_('v')), 
    __.addE('created').from_('v').\
    property('weight',0.5)).iterate()

最后的iterate() 很重要,因为与 gremlin 控制台相比,在 python 中工作时需要提供一个终端步骤。您也可以使用其他终端步骤,例如 next(),但没有任何终端步骤,将不会创建边缘(至少在 Neptune 中)

【讨论】:

    猜你喜欢
    • 2019-02-26
    • 2022-06-12
    • 1970-01-01
    • 2020-02-04
    • 2020-07-01
    • 1970-01-01
    • 2017-04-25
    • 2021-12-21
    • 1970-01-01
    相关资源
    最近更新 更多