我的遍历如下:
g.V().hasLabel("demoUser")
.as("demoUser","socialProfile","followCount","requestCount")
.select("demoUser","socialProfile","followCount","postCount")
.by(__.valueMap())
.by(__.out("socialProfileOf").valueMap())
.by(__.in("followRequest").hasId(currentUserId).count())
.by(__.outE("postAuthorOf").count())
我试图选择用户顶点,他们链接的社交个人资料顶点以及其他一些计数。问题是所有用户可能没有socialProfile
优势。在这种情况下,遍历失败并出现以下错误:
提供的开始不映射到值:v [8280] - > [TitanVertexStep(OUT,[socialProfileOf],vertex),PropertyMapStep(value)]
我确实从gremlin团队找到了this thread。我尝试使用.by()
将coalesce()
内部的逻辑包装起来,并在语句的末尾添加.fold()
而没有运气。
如何选择该选项?我想选择一个socialProfile
(如果存在),但始终选择demoUser
。
答案 0 :(得分:5)
coalesce
是正确的选择。让我们假设现代图中的人有一个或没有与之相关的项目:
gremlin> g.V().hasLabel("person").as("user","project").
select("user","project").by("name").by(coalesce(out("created").values("name"),
constant("N/A")))
==>{user=marko, project=lop}
==>{user=vadas, project=N/A}
==>{user=josh, project=ripple}
==>{user=peter, project=lop}
另一种方法是将其从结果中完全排除:
g.V().hasLabel("person").as("user","project").choose(out("created"),
select("user","project").by("name").by(out("created").values("name")),
select("user").by("name"))
但很明显,如果每个分支返回一个地图/选择多于一个的东西,这只会看起来很好,否则你将会有混合的结果类型。