首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gremlin python -在向顶点添加属性时如何忽略类型列表的属性

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

Stack Overflow用户
提问于 2020-12-04 19:56:50
回答 1查看 345关注 0票数 0

我想在一个与以下代码一起工作的图形中添加人作为顶点:

代码语言:javascript
复制
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,怎么办?示例:

代码语言:javascript
复制
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转换为字符串,然后将其作为属性添加

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-08 13:51:35

我可能错了,但我感觉到你的问题最终会比你发布的更复杂。考虑到这一点,我将给出一个可行的答案,假设每个房子都是唯一的,我用我添加到数据中的"hid“(house id)更清楚地说明了这一点。

代码语言:javascript
复制
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通常包含一个折叠/合并/展开模式,该模式与您正在使用的“只插入”模式立即冲突,因为您不能在减少障碍(即折叠)后面的遍历(即指前面的步骤)中回溯。在这种情况下,我想我会尝试重构源数据,以使其更适合于纯插入操作,而不是重新插入操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65149903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档