提供的开始不会映射到值

时间:2016-04-21 16:05:21

标签: titan gremlin

我的遍历如下:

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

1 个答案:

答案 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"))

但很明显,如果每个分支返回一个地图/选择多于一个的东西,这只会看起来很好,否则你将会有混合的结果类型。