Python 更新顶点及其所有子顶点和边

Python 更新顶点及其所有子顶点和边,python,graph,gremlin,tinkerpop3,amazon-neptune,Python,Graph,Gremlin,Tinkerpop3,Amazon Neptune,我在图中插入了像这样的JSON实体作为边和顶点,正如您所看到的,每个实体都已经是高度相关的格式 person={ “摘要”:“加拿大国家银行Unix系统管理员”, “id”:“P6ZiIHhJ-PhON9W6UgeFwfA”, “姓名”:“帕特里克”, “类型”:“人”, “就业”:[ { “isCurrent”:正确, “雇主”:{ “名称”:“位于加拿大的商业银行”, “类型”:“公司” }, “标题”:“Unix系统管理员” } ], “技能”:[ { “名称”:“字符串” } ], “地

我在图中插入了像这样的JSON实体作为边和顶点,正如您所看到的,每个实体都已经是高度相关的格式

person={
“摘要”:“加拿大国家银行Unix系统管理员”,
“id”:“P6ZiIHhJ-PhON9W6UgeFwfA”,
“姓名”:“帕特里克”,
“类型”:“人”,
“就业”:[
{
“isCurrent”:正确,
“雇主”:{
“名称”:“位于加拿大的商业银行”,
“类型”:“公司”
},
“标题”:“Unix系统管理员”
}
],
“技能”:[
{
“名称”:“字符串”
}
],
“地点”:[
{
“国家”:{
“姓名”:“加拿大”,
“类型”:“管理区域”
}
}
],
“某些顶点”:{
“k”:“v”
}
}
生成的图形:


我的问题是,在未来,我可能会收到同一个人的新json,如果有什么变化,我需要在图中“更新它”,并确保删除任何不再存在的子顶点。有点像upsert,但在所有子节点和边上

现在,我在每个子元素上添加根id作为属性,这样我就可以找到它们并在以后删除它们。还有别的办法吗

我的实际过程:

  • 递归添加python dict中的所有垂直线和边,嵌套dict都成为顶点,并在其与父对象之间添加边
  • def添加顶点(g、标签、dct、实体id):
    顶点=g.addV(label).property('entity\u id',entity\u id)
    添加属性(g、顶点、dct、实体id)
    返回顶点
    def添加属性(g、顶点、dct、实体id):
    #添加属性
    对于dct.items()中的k,v:
    如果[str,bool,int,float]中的类型(v):
    顶点=顶点属性(k,v)
    [str,bool,int,float]中的elif v和isinstance(v,list)以及type(v[0]):
    对于v中的文字:
    vertex=vertex.property(Cardinality.set,k,literal)
    顶点=顶点。下一个()
    #向其添加子顶点和边
    对于dct.items()中的k,v:
    如果存在(v,dict):
    嵌套顶点=添加顶点(g、k、v、实体id)
    添加边(g、k、顶点、嵌套顶点、实体id)
    elif v和isinstance(v,list)和isinstance(v[0],dict):
    对于v中的嵌套_v:
    嵌套顶点=添加顶点(g、k、嵌套v、实体id)
    添加边(g、k、顶点、嵌套顶点、实体id)
    def add_edge(g,name,from_v,to_v,entity_id):
    g、 addE(name).property('entity_id',entity_id.).from_(from_v).to(to_v).iterate()
    添加顶点(g,'Person',Person,Person['id'])
    
  • 如果我收到具有相同id的人,想象顶点“someVertex”现在在dict中消失了,我如何“插入”最初来自此人的整个顶点和边树,以便移除该顶点?现在,我删除了在上一步中添加的具有“entity_id”属性的所有元素
  • 如果g.V()具有(实体类型'id',实体id.).hasNext():
    g、 V().has('entity_id',entity_id).drop().iterate()
    添加顶点(g,实体类型,实体,实体id)
    
    将“实体id”属性添加到所有顶点并不是查找所有要删除的顶点的可怕方法。一种更面向图形的方法是简单地沿着父对象的边递归地删除您找到的所有顶点:

    gremlin> g = TinkerGraph.open().traversal()
    ==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
    gremlin> g.addV().property(id, 'A').as('a').
    ......1>   addV().property(id, 'B').as('b').
    ......2>   addV().property(id, 'C').as('c').
    ......3>   addV().property(id, 'E').as('e').
    ......4>   addV().property(id, 'F').as('f').
    ......5>   addE('hasParent').from('a').to('b').
    ......6>   addE('hasParent').from('b').to('c').
    ......7>   addE('hasParent').from('c').to('e').
    ......8>   addE('hasParent').from('e').to('f').iterate()
    gremlin> g.V().has(id,'B').
    ......1>   emit().
    ......2>   repeat(out()).
    ......3>   aggregate('x').
    ......4>   select('x').unfold().
    ......5>   drop()
    gremlin> g.V().elementMap()
    ==>[id:A,label:vertex]
    
    我选择了
    aggregate()


    有一些方法可以使用更真实的upsert样式语义来更新图形结构。不过你有一个相当健壮的树结构,所以我觉得这将是一个相当粗而复杂的小精灵。可能在你的情况下,放弃所有这些并将其重新添加是最有意义的——很难说。上面的许多地方都描述了upserts的模式,您可能会四处搜索。

    您是说upserts方法会留下孤立的子顶点,需要稍后删除吗?是否有某些原因使您无法在执行upsert时删除子项?也许你可以再描述/展示一下这个过程?@stephenmallette我补充了一些信息,我是新的小精灵和图形,也许我的第一步也有一些需要改进的地方,因为它相当缓慢。谢谢