【发布时间】:2021-01-23 15:15:44
【问题描述】:
我有像这样的 JSON 实体,我将它们作为边和顶点插入到图中,如您所见,每个实体都已经是高度相关的格式。
person = {
"summary": "Unix System Administrator at National Bank of Canada",
"id": "P6ZiIHhJ-PhON9W6UgeFwfA",
"name": "Patrick",
"type": "Person",
"employments": [
{
"isCurrent": True,
"employer": {
"Name": "Commercial bank located in Canada",
"type": "Corporation"
},
"title": "Unix System Administrator"
}
],
"skills": [
{
"name": "string"
}
],
"locations": [
{
"country": {
"name": "Canada",
"type": "AdministrativeArea"
}
}
],
"someVertex": {
"k": "v"
}
}
我的问题是,将来,我可能会收到同一个人的新 json,如果发生变化,我需要在图中“更新”它,并确保删除任何不再存在的子顶点。有点像 upsert,但在所有子节点和边上。
现在,我将根 id 作为属性添加到每个子元素上,这样我就可以找到它们并在以后删除它们。有没有其他方法可以做到这一点?
我的实际过程:
- 递归地从python dict中添加所有verticles和edges,嵌套的dicts都成为顶点,并在它和父级之间添加一条边。
def add_vertex(g, label, dct, entity_id):
vertex = g.addV(label).property('entity_id', entity_id)
add_properties(g, vertex, dct, entity_id)
return vertex
def add_properties(g, vertex, dct, entity_id):
# Add properties
for k, v in dct.items():
if type(v) in [str, bool, int, float]:
vertex = vertex.property(k, v)
elif v and isinstance(v, list) and type(v[0]) in [str, bool, int, float]:
for literal in v:
vertex = vertex.property(Cardinality.set_, k, literal)
vertex = vertex.next()
# Add child vertexes and edges to them
for k, v in dct.items():
if isinstance(v, dict):
nested_vertex = add_vertex(g, k, v, entity_id)
add_edge(g, k, vertex, nested_vertex, entity_id)
elif v and isinstance(v, list) and isinstance(v[0], dict):
for nested_v in v:
nested_vertex = add_vertex(g, k, nested_v, entity_id)
add_edge(g, k, vertex, nested_vertex, entity_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()
add_vertex(g, 'Person', person , person['id'])
- 如果我收到具有相同 id 的人,想象顶点“someVertex”现在不在字典中,我如何“插入”最初来自此人的整个顶点和边树,以便该顶点已移除?现在,我删除了我在上一步中添加的具有“entity_id”属性的所有元素。
if g.V().has(entity_type, 'id', entity_id).hasNext():
g.V().has('entity_id', entity_id).drop().iterate()
add_vertex(g, entity_type, entity, entity_id)
【问题讨论】:
-
您是说您的 upserting 方法会留下需要稍后删除的孤立子顶点吗?是否有某些原因您不能在执行 upsert 时删除孩子?或许你可以多描述/展示一下这个过程?
-
@stephenmallette 我添加了一些信息,我是新的小精灵和图表,也许我的第一步也有一些需要改进的地方,因为它很慢。谢谢。
标签: python graph gremlin tinkerpop3 amazon-neptune