'How do I pull specific property values from an injected object when adding a batch of edges in a Gremlin/TinkerPop traversal?

I want to add batches of edges to a JanusGraph db that already contains nodes. I want my edges to support setting dynamic/optional properties.

I've cobbled together the following traversal (based on this SO question) that I believe illustrates what I want to do:

1..inject() a batch of edges 2. Pull to/from vertex ids from the objects in the injected edge batch 3. Set all fields in edge batch objects as edge properties with .sideEffect()

uuid_1 = "89079f8fa3ee849a61a45e0b3e6d28cd"
uuid_2 = "00a9ae430dc812f483b0660212264190"

edge_batch = [
    {
        "from_uuid": uuid_1,
        "to_uuid": uuid_2,
        "posted_at": 1650012568000,
        "test_property_2": "I was here"
    },
    {
        "from_uuid": uuid_2,
        "to_uuid": uuid_1,
        "posted_at": 1650012568888,
        "test_property_3": "I'M STILL HERE"
    }
]

new_edges = (
    g
    .inject(edge_batch)
    .unfold()
    .as_("edge_batch")
    .V()
    .has("uuid", __.select("edge_batch").select("to_uuid"))
    .as_("to_v")
    .V()
    .has("uuid", __.select("edge_batch").select("from_uuid"))
    .addE("MY_EDGE_TYPE")
    .to("to_v")
    .as_("new_edge")
    .sideEffect(
        __.select("edge_batch")
        .unfold()
        .as_("kvp")
        .select("new_edge")
        .property(
            __.select("kvp").by(Column.keys), __.select("kvp").by(Column.values)
        )
    )
    .iterate()
)

As written, the code above results in a traversal timeout when the referenced vertices exist. If I replace the first two __.select("edge_batch")... expressions above with references to the uuid_1 and uuid_2 variables, the code works. I think my problem is I just can't figure out how I'm supposed to reference properties of the injected, unfolded edge batch objects.

I'm using gremlin-python v3.6.0, JanusGraph v0.6.1, TinkerPop v3.5.1.



Solution 1:[1]

Your code runs just fine with a small graph. Only, the two unfolds from a list with two elements makes your code run four times, unintentionally I guess. As to why the code does not run on your janusgraph installation:

  • Be sure uuid is an indexed property if your graph is large
  • Maybe you were confused by vertices with uuid_1 and uuid_2 being present in the janusgraph cache, because .has("uuid", __.select("edge_batch").select("to_uuid")) and .has("uuid", uuid_1) really do the same.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 HadoopMarc