Graph/Gremlinpython: Upsert 2个顶点和一条边从一个到另一个

Graph/Gremlinpython: Upsert 2 vertices and an edge from one to the other

我尝试添加(如果它们不存在)2 个顶点并在单个查询中添加从第一个到另一个的边。 它看起来像:

g.V().has("label1", "property1", "value1").fold().coalesce(
        __.unfold(),
        g.addV("label1").property("property1", "value1")
    ).as_("a").V().has("label2", "property2", "value2").fold().coalesce(
        __.unfold(),
        g.addV("label2").property("property2", value2)
    ).coalesce(
        __.inE("link").where(__.outV().as_("a")),
        __.addE("link").from_("a")
    ).next()

但是由于 fold() 作为屏障,它删除了我放在第一个顶点上的标签 "a"。 我的解决方法如下:

g.V().has("label1", "property1", "value1").fold().coalesce(
        __.unfold(),
        g.addV("label1").property("property1", "value1")
    ).as_("a").V().has("label2", "property2", "value2").fold().coalesce(
        __.unfold(),
        g.addV("label2").property("property2", value2)
    ).coalesce(
        __.inE("link").where(__.outV().has("label1", "property1", value1)),
        __.addE("link").from_(__.V().has("label1", "property1", value1))
    ).next()

我可以做得更好吗?这……丑吗?


好的,store解决方案有效:) 但是我在最后一个合并的第一部分遇到了问题。 我这样做了:

g.V().has("label1", "property1", "value1").fold().coalesce(
    __.unfold(),
    g.addV("label1").property("property1", "value1")
).as_("a").V().has("label2", "property2", "value2").fold().coalesce(
    __.unfold(),
    g.addV("label2").property("property2", value2)
).coalesce(
    __.inE("link").where(__.outV().where(within("a"))),
    __.addE("link").from_(select("a").unfold())
).next()

它工作正常,感谢 Kelvin Lawrence :)

也许使用 store 而不是 as 可以满足您的需求:

这是一个使用 Gremlin 控制台的虚构示例。

gremlin> g.V().hasLabel('notyet').
......1>       fold().
......2>       coalesce(unfold(),addV('notyet')).
......3>       store('a').
......4>       V().
......5>       hasLabel('notyet2').
......6>       fold().
......7>       coalesce(unfold(),addV('notyet2')).
......8>       coalesce(__.in('link').where(within('a')),
                        addE('link').to(select('a').unfold())) 
==>e[61330][61329-link->61327]