Gremlin 查询不起作用 - 2 x 顶点(如果不存在)并添加边缘



我使用的是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')

鉴于您对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')

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

问题代码是部分代码。一些调整会有所帮助。

尽管如此,我认为你的问题在as('jobtitle')中,它在coalesce语句中。也就是说,如果顶点存在,我们就不会进行第二次遍历,并且不会执行as语句。与as('user')相同。

要解决此问题,只需将as语句移到coalesce之外即可。

相关内容

最新更新