在1个查询gremlin中创建不存在的顶点和边缘

时间:2019-01-19 10:05:31

标签: graph gremlin janusgraph

我发现以下代码可以创建edge(如果尚不存在)。

g.V().hasLabel("V1")
.has("userId", userId).as("a")
.V().hasLabel("V1").has("userId", userId2)
.coalesce(
        bothE("link").where(outV().as("a")),
        addE("link").from("a")
)

它工作正常,但是如果1个查询中不存在顶点和边,我想创建它们。

我尝试用以下代码编写新图,它只是创建新顶点,但它们之间没有关系。

g.V().hasLabel("V1")
.has("userId", userId).fold()
.coalesce(
        unfold(),
        addV("V1").property("userId", userId1)
).as("a")
.V().hasLabel("V1").has("userId", userId2).fold()
.coalesce(
        unfold(),
        addV("V1").property("userId", userId2)
)
.coalesce(
        bothE("link").where(outV().as("a")),
        addE("link").from("a")
)

1 个答案:

答案 0 :(得分:3)

感谢JanusGraph google group中的Daniel Kuppitz。我找到了解决方案。我将其重新发布给需要的人。

查询中有两个问题。第一个是它无法按预期运行的原因:fold()步骤。使用fold()会破坏路径历史记录,但是您可以通过在子遍历中进行该操作来轻松解决该问题:

g.V().has("V1","userId", userId1).fold().
  coalesce(unfold(),
           addV("V1").property("userId", userId1)).as("a").
  map(V().has("V1","userId", userId2).fold()).
  coalesce(unfold(),
           addV("V1").property("userId", userId2))
  coalesce(inE("link").where(outV().as("a")),
           addE("link").from("a"))

第二个问题是E和outV的结合。您应该使用bothE/otherVoutE/inVinE/outV