我使用的是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
之外即可。