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