Gremlin Python-如果不存在边,则在边创建时向边添加未知数量的属性

问题描述 投票:0回答:1

查询应针对以下内容:

  • 如果存在两个顶点之间的边,则返回该边
  • 其他:创建边缘,从字典设置属性,然后返回边缘。

如果traversal是原始遍历,则以下内容有效。如果traversal已经包含其他一些步骤(例如创建顶点)它崩溃并显示以下错误。


properties = {"p1": "p1_value", "p2": "p2_value"}

traversal.V().inject(properties).as_(props_label).
V().has("uuid",from_uuid).as_(from_label).
V().has("uuid",to_uuid).as_(to_label).
coalesce(inE(edge_label).where(outV().
as_(from_label)),addE(edge_label).
from_(from_label).as_(e_label).select(props_label).
unfold().as_(kv_label).select(e_label).
property(select(kv_label).by(Column.keys),select(kv_label).by(Column.values))).iterate()
gremlin_python.driver.protocol.GremlinServerError: 500: The provided object does not have accessible keys: class org.janusgraph.graphdb.vertices.StandardVertex

如果我在iterate()之前进行遍历,则可以。但是出于性能原因,我想避免重复。

有什么想法吗?

编辑:

我做了更多测试。事先添加顶点即可。不在同一查询中添加它们。

此作品:

injecting

此失败:

gremlin> g.addV("TestType").property("name", "1")
==>v[2302192]
gremlin> g.addV("TestType").property("name", "2")
==>v[2326704]
gremlin> g.inject(["p1": "v1", "p2": "v2"]).unfold().as("props").V(2302192).as("from").V(2326704).as("to").coalesce(inE("DEPENDS_ON").where(outV().as("from")), addE("DEPENDS_ON").from("from").property(select("props").by(keys), select("props").by(values)))
==>e[187by-1dcds-1lh-1dvao][2302192-DEPENDS_ON->2326704]
==>e[187by-1dcds-1lh-1dvao][2302192-DEPENDS_ON->2326704]
gremlin tinkerpop3 janusgraph
1个回答
1
投票

作为初始点,遍历中不需要第一个gremlin> g.addV("TestType").property("name", "1").addV("TestType").property("name", "2").inject(["p1": "v1", "p2": "v2"]).unfold().as("props").V().has("name", "1").as("from").V().has("name", "2").as("to").coalesce(inE("DEPENDS_ON").where(outV().as("from")), addE("DEPENDS_ON").from("from").property(select("props").by(keys), select("props").by(values))).dedup() The provided object does not have accessible keys: class org.janusgraph.graphdb.vertices.StandardVertex 。您只需要从V开始。如果以inject()开头,则将对图形中的每个顶点执行以下步骤。

就是说,我看不到您的遍历有问题,一旦我将其适应现代玩具图,它就可以在TinkerGraph上正常工作:

V()

您可能希望在此遍历中获得gremlin> g = TinkerFactory.createModern().traversal() ==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard] gremlin> properties = [p1: "p1_value", p2: "p2_value"] ==>p1=p1_value ==>p2=p2_value gremlin> g.inject(properties).as('props_label'). ......1> V().has("name",'marko').as('from_label'). ......2> V().has("name",'josh').as('to_label'). ......3> coalesce(inE('knows').where(outV().as('from_label')), ......4> addE('knows').from('from_label').as('e_label').select('props_label'). ......5> unfold().as('kv_label').select('e_label'). ......6> property(select('kv_label').by(Column.keys), ......7> select('kv_label').by(Column.values))) ==>e[8][1-knows->4] gremlin> g.inject(properties).as('props_label'). ......1> V().has("name",'peter').as('from_label'). ......2> V().has("name",'vadas').as('to_label'). ......3> coalesce(inE('knows').where(outV().as('from_label')), ......4> addE('knows').from('from_label').as('e_label').select('props_label'). ......5> unfold().as('kv_label').select('e_label'). ......6> property(select('kv_label').by(Column.keys), ......7> select('kv_label').by(Column.values))) ==>e[13][6-knows->2] ==>e[13][6-knows->2] 结果,因为在第5行给出了dedup()的情况下,地图中的每个属性键都会得到一个结果。

您收到的错误是服务器端错误,我认为gremlinpython没有问题。它指出了unfold()试图访问JanusGraph select('kv_label').by(Column.keys)对象的情况,但是我不太清楚问题中包含的遍历是如何实现的。也许您可以尝试在Gremlin Console中针对JanusGraph进行遍历,以查看是否获得类似的结果。

© www.soinside.com 2019 - 2024. All rights reserved.