鉴于您最近对 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() 会生成一个空列表,该列表将成为新的遍历器并且遍历将继续执行) .