gremlin python-向顶点添加多个但数量未知的属性


问题内容

我想为一个顶点添加多个属性,但是从一开始就不明确地知道这些属性可能是什么。例如,假设有一个要添加为图的顶点的人,我们具有以下属性字典:

人1

{
    "id": 1,
    "first_name": "bob",
    "age": 25,
    "height": 177
}

也许要添加另一个顶点,一个人具有以下属性:

人2

{
    "id": 2,
    "first_name": "joe",
    "surname": "bloggs",
    "occupation": "lawyer",
    "birthday": "12 September"
}

有没有一种方法可以将两个人都添加到图中,而无需在Gremlin 属性 函数中明确地对属性键和值进行硬编码?

链接提供了正确方向的答案。在这里可以找到更多有用的信息。下一行反映了建议的解决方案,按预期执行,并在图中添加了一个新顶点。大。

g.addV("person").property("id", 1, "first_name", "bob", "age", 25, "height", 177).next()

但是,它仅在输入经过硬编码的情况下才起作用。我已经将属性字典转换为(k1,v1,k2,v2,…,kn,vn)形式的值元组,但是无法以编程方式传递值。例如

tup_vals = ("id", 1, "first_name", "bob", "age", 25, "height", 177)

但是无论出于什么原因,我都不能打电话给:

g.addV("person").property(*tup_vals).next()

上面的行没有抛出异常,只是没有按预期执行(即未传递属性)

是否有人对如何以计算方式将这些属性字典传递到Gremlin属性函数有任何见解?


更新:天真/低效的解决方案

下面提供了一个解决方案,但这是一个糟糕的解决方案,因为它每次查询都会查询gremlin服务器。理想情况下,我想同时添加所有属性。如果id是唯一的,则仅能按预期工作。

g.addV("person").property('id', id).next()

for k,v in property_dictionary[id].items():
     g.V().has('id', id).property(k, v).iterate()

回答

感谢Daniel的回答。我已经调整了他的答案(如下),以符合gremlin_python软件包。

重要提示从这个答案keysvalues-在源代码中给定的情况下应该从列枚举导入这里

from gremlin_python.process.graph_traversal import __
from gremlin_python.process.traversal import Column

persons = [{"id":1,"first_name":"bob","age":25,"height": 177}, {"id":2,"first_name":"joe","surname":"bloggs","occupation":"lawyer","birthday":"12 September"}]

g.inject(persons).unfold().as_('entity').\
    addV('entity').as_('v').\
        sideEffect(__.select('entity').unfold().as_('kv').select('v').\
                   property(__.select('kv').by(Column.keys),
                            __.select('kv').by(Column.values)
                            )
                  ).iterate()

问题答案:

您可以将地图/字典插入遍历中,为每个字典创建一个顶点,然后遍历所有字典/地图条目并将它们设置为属性。在Gremlin中,如下所示:

g.inject(persons).unfold().as('person').
  addV('person').as('v').
  sideEffect(select('person').unfold().as('kv').
             select('v').
               property(select('kv').by(keys), select('kv').by(values))).
  iterate()

例:

gremlin> persons = [["id":1,"first_name":"bob","age":25,"height": 177]
......1>           ,["id":2,"first_name":"joe","surname":"bloggs",
                       "occupation":"lawyer","birthday":"12 September"]]
==>[id:1,first_name:bob,age:25,height:177]
==>[id:2,first_name:joe,surname:bloggs,occupation:lawyer,birthday:12 September]

gremlin> g = TinkerGraph.open().traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.inject(persons).unfold().as('person').
......1>   addV('person').as('v').
......2>   sideEffect(select('person').unfold().as('kv').
......3>              select('v').
......4>                property(select('kv').by(keys), select('kv').by(values))).
......5>    valueMap()
==>[id:[1],first_name:[bob],age:[25],height:[177]]
==>[birthday:[12 September],occupation:[lawyer],surname:[bloggs],id:[2],first_name:[joe]]