提供的开始未映射到值

The provided start does not map to a value

我有一个遍历如下:

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())

我正在尝试 select 用户顶点、他们链接的社交资料顶点和其他一些计数。问题是并非所有用户都具有 socialProfile 优势。在这种情况下,遍历失败并出现以下错误:

The provided start does not map to a value: v[8280]->[TitanVertexStep(OUT,[socialProfileOf],vertex), PropertyMapStep(value)]

我确实从 gremlin 团队找到了 this thread。我尝试用 coalesce() 包装 .by() 内部的逻辑,并且还附加了 .fold() 到语句的末尾,但没有成功。

如何使 selection 可选?我想 select 一个 socialProfile 如果存在,但总是 select demoUser.

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

但很明显,只有每个分支 returns 一个映射/选择超过 1 个事物时,这才会看起来不错,否则你将得到混合结果类型。