-2

我正在使用 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')
4

2 回答 2

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')

在它之前有一个额外的V()权利,addE()它基本上会调用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')

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

于 2020-03-24T11:26:23.483 回答
0

问题代码是部分的。一些对齐会有所帮助。

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

要解决,只需将as语句移到coalesce.

于 2020-03-20T12:53:37.420 回答