Gremlin python - 如何在向顶点添加属性时忽略类型列表的 属性

Gremlin python - how to ignore property of type List when adding properties to vertex

我想在使用以下代码的图中添加人作为顶点:

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

persons = [{"id":1,"name":"bob","age":25}, {"id":2,"name":"joe","age":25,"occupation":"lawyer"}]    

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()

问题 1: 如果其中一个属性是列表或字典怎么办。示例:

persons = [{"id":1,"name":"bob","age":25, "house":{"a":1,"b":4}}, {"id":2,"name":"joe","age":25,"occupation":"lawyer","house":{"a":1,"b":4}}]

如何忽略 1 属性(房子)但仍将其余部分添加到人顶点?然后拿走并创建另一个顶点(添加属性 a 和 b),边缘为 person?

问题二: 如果我想在将属性作为 属性 添加到图表之前修改属性怎么办? 例如:将 id 转换成字符串,然后添加为 属性

我可能是错的,但我感觉你的问题最终会比你发布的问题更复杂。考虑到这一点,我将提供一个可行的答案,假设每个房子都是独一无二的,我已经用我添加到数据中的“隐藏”(房屋 ID)更加清楚。

gremlin> persons = [["pid":1,"name":"bob","age":25, "house":["hid":10,"a":1,"b":4]], 
......1>            ["pid":2,"name":"joe","age":25,"occupation":"lawyer","house":["hid":20,"a":1,"b":4]]]
==>[pid:1,name:bob,age:25,house:[hid:10,a:1,b:4]]
==>[pid:2,name:joe,age:25,occupation:lawyer,house:[hid:20,a:1,b:4]]
gremlin> g.inject(persons).unfold().as('entity').
......1>   addV('entity').as('v').
......2>   sideEffect(select('entity').unfold().as('kv').select('v').
......3>              choose(select('kv').by(keys).is('house'),
......4>                     addV('house').as('h').
......5>                     addE('owns').from('v').
......6>                     select('kv').by(values).unfold().as('hkv').select('h').
......7>                     property(select('hkv').by(keys),
......8>                              select('hkv').by(values)),
......9>                     property(select('kv').by(keys),
.....10>                              select('kv').by(values))))
==>v[0]
==>v[9]
gremlin> g.V().elementMap()
==>[id:0,label:entity,name:bob,pid:1,age:25]
==>[id:4,label:house,a:1,hid:10,b:4]
==>[id:9,label:entity,occupation:lawyer,name:joe,pid:2,age:25]
==>[id:14,label:house,a:1,hid:20,b:4]
gremlin> g.E().elementMap()
==>[id:5,label:owns,IN:[id:4,label:house],OUT:[id:0,label:entity]]
==>[id:15,label:owns,IN:[id:14,label:house],OUT:[id:9,label:entity]]

我在这里并没有真正做任何新的事情,从这个意义上说,我基本上只是将您已经在使用的遍历模式嵌入到它本身中。请注意,在第 6 行,我只是重新执行 sideEffect().

中第 2 行所做的操作

现在,如果我关于在您的数据中拥有独特房屋的假设是错误的,那么事情会变得更加复杂,因为您无法在此上下文中轻松地内联更新插入遍历模式。更新插入通常涉及 fold/coalesce/unfold 模式,该模式立即与您正在使用的这种“仅插入”模式冲突,因为您无法在减少障碍(即折叠)后面的遍历(即参考上一步)中回溯).我想我会尝试在这种情况下重组源数据,使其更适合纯插入而不是更新插入操作。