我想在一个与以下代码一起工作的图形中添加人作为顶点:
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:如果其中一个属性是List或dict,怎么办?示例:
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}}]我如何忽略那一项财产(房子),但仍将其余的添加到人的顶点?然后把房子和创建另一个顶点(添加属性a和b)与边缘的人?
问题2:在将属性作为属性添加到图中之前,如果要修改属性,怎么办?例如:将id转换为字符串,然后将其作为属性添加
发布于 2020-12-08 13:51:35
我可能错了,但我感觉到你的问题最终会比你发布的更复杂。考虑到这一点,我将给出一个可行的答案,假设每个房子都是唯一的,我用我添加到数据中的"hid“(house 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行所做的工作。
现在,如果我的假设是错误的,在您的数据中有独特的房子,那么事情会变得更加复杂,因为您不能轻松地内联插入遍历模式在这种情况下。Upserts通常包含一个折叠/合并/展开模式,该模式与您正在使用的“只插入”模式立即冲突,因为您不能在减少障碍(即折叠)后面的遍历(即指前面的步骤)中回溯。在这种情况下,我想我会尝试重构源数据,以使其更适合于纯插入操作,而不是重新插入操作。
https://stackoverflow.com/questions/65149903
复制相似问题