【问题标题】:Gremlin query not working - 2 x vertex if doesn't exist and add edgeGremlin 查询不起作用 - 如果不存在,则为 2 x 顶点并添加边
【发布时间】:2020-07-01 05:27:44
【问题描述】:

我正在使用 gremlin 并有以下声明。我想:

  • 如果不存在则创建一个顶点
  • 如果不存在则创建另一个顶点
  • 在顶点之间创建一条边

没有创建边缘。非常感谢您对这里的逻辑/方法的帮助。

    g.V().has('User','refId','435').
        fold().coalesce(unfold(),addV(label, 'User').
    property('name','John Smith').property('refId','435'))
        .as('user').
        V().has('JobTitle','name','Advisor').
        fold().coalesce(unfold(),addV(label,'JobTitle').
property('name','Advisor'))
.as('jobtitle').
    addE('REGISTERED_AS').from('user').to('jobtitle')

【问题讨论】:

  • 请您添加完整的查询(它已被截断),一般情况下最好包含您正在使用的后端图形数据库的描述以及任何其他示例和评论以使问题更多完成。
  • @KelvinLawrence 我已经在上面更新了。问题是顶点之间没有创建边。
  • 您不能只向addV() 提供字符串列表。您需要像在上一个示例中一样使用property() 步骤。此外,如果您将查询拆分为多行,阅读查询会容易得多。
  • @KelvinLawrence 谢谢。我已经更新了,但是仍然没有创建边缘。你能帮忙解决这个问题吗?

标签: gremlin gremlin-server azure-cosmosdb-gremlinapi


【解决方案1】:

鉴于您最近对 Kfir 答案的评论(包括您的最新代码),我认为您的方法有几个问题需要纠正。首先请注意,addV() 不需要一长串标签和属性。我很惊讶没有为您产生错误。 addV() 只是将顶点标签作为参数,然后您使用 property() 提供关联的键/值对。

g.V().has('User', 'refId', '435').
      fold().
      coalesce(unfold(), 
               addV('User').
                 property('name', 'John Smith').property('refId', '435').property('firstName', 'John').
                 property('lastName', 'Smith').property('JobTitle', 'Chief Executive Officer')).as('user').
      V().has('JobTitle', 'name', 'Advisor').
      fold().
      coalesce(unfold(), addV(label, 'JobTitle', 'name', 'Advisor')).as('jobtitle').
      V().
      addE('REGISTERED_AS').
        from('user').
        to('jobtitle')

addE() 之前有一个额外的V(),它基本上会为你图中的每个顶点调用addE(),而不仅仅是你想要添加边的一个顶点。

g.V().has('User', 'refId', '435').
      fold().
      coalesce(unfold(), 
               addV('User').
                 property('name', 'John Smith').property('refId', '435').property('firstName', 'John').
                 property('lastName', 'Smith').property('JobTitle', 'Chief Executive Officer')).as('user').
      V().has('JobTitle', 'name', 'Advisor').
      fold().
      coalesce(unfold(), addV(label, 'JobTitle', 'name', 'Advisor')).as('jobtitle').
      addE('REGISTERED_AS').
        from('user').
        to('jobtitle')

所以,现在看起来语法正确,但有一个问题,它源于此:

gremlin> g.V(1).as('x').fold().unfold().addE('self').from('x').to('x')
The provided traverser does not map to a value: v[1]->[SelectOneStep(last,x)]
Type ':help' or ':h' for help.
Display stack trace? [yN]

在减少步骤(即fold())之后,遍历中的路径信息会丢失,因此之后您无法选择回到“x”。您需要稍微修改一下遍历以不需要fold()

g.V().has('User', 'refId', '435').
      fold().
      coalesce(unfold(), 
               addV('User').
                 property('name', 'John Smith').property('refId', '435').property('firstName', 'John').
                 property('lastName', 'Smith').property('JobTitle', 'Chief Executive Officer')).as('user').
      coalesce(V().has('JobTitle', 'name', 'Advisor'),
               addV('JobTitle').property('name', 'Advisor')).as('jobtitle').
      addE('REGISTERED_AS').
        from('user').
        to('jobtitle')

这实际上意味着更直接地使用coalesce() 而不使用fold()unfold() 模式。您实际上只需要在遍历开始时使用该模式以确保遍历器在流中保持活动状态(即,如果用户不存在 fold() 会生成一个空列表,该列表将成为新的遍历器并且遍历将继续执行) .

【讨论】:

    【解决方案2】:

    问题代码不完整。一些对齐会有所帮助。

    不过,我认为您的问题出在as('jobtitle') 中,它位于coalesce 语句中。也就是说,如果顶点存在,我们就不会进行第二次遍历,也不会执行as 语句。 as('user') 也一样。

    要解决,只需将as 语句移到coalesce 之外。

    【讨论】:

    • 感谢@Kfir Dadosh。我已更改为将语句移到外面,但仍然没有创建边缘。进一步的想法?这是最新的: gV().has('User','refId','435').fold().coalesce(unfold(),addV(label, 'User', 'name','John Smith', 'refId', '435','firstName','John','lastName','Smith','JobTitle','首席执行官')).as('user').V().has(' JobTitle','name','Advisor').fold().coalesce(unfold(),addV(label, 'JobTitle', 'name','Advisor')).as('jobtitle').V() .addE('REGISTERED_AS').from('user').to('jobtitle')
    • 你能帮忙解决上面的问题吗?
    猜你喜欢
    • 2021-12-13
    • 2022-06-12
    • 2019-02-26
    • 2019-06-13
    • 1970-01-01
    • 2015-02-07
    • 2018-02-12
    • 2018-02-11
    • 2015-07-06
    相关资源
    最近更新 更多