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