英文:
Upserting an edge using Gremlin
问题
以下是您要翻译的内容:
There are two types of vertices in my graph: Entity and Component.
Components are “ATTACHED_TO” Entities. Components do not exist in the graph as free standing vertices. They are always attached to an Entity. So I don’t need to find Component X in the graph.
When a Component is added, if the Entity it is attached to does not exist then it should be created.
If on upsert both the Component and Entity exist, then the value property of the Component should be updated.
I'm trying to write an efficient gremlin query for AWS Neptune.
https://docs.aws.amazon.com/neptune/latest/userguide/gremlin-efficient-upserts.html documents an optimization that Neptune makes, if properties are not set within coalesce. The following query accomplishes my design, but contains property set within the coalesce.
I've rewritten the query to remove property set within coalesce. I think I'm close, but can't quite seem to get a query that doesn't have some sort of syntax error.
There error is on the where statement. I haven't figured out how to express the where clause.
英文:
There are two types of vertices in my graph: Entity and Component.
Components are “ATTACHED_TO” Entities. Components do not exist in the graph as free standing vertices. They are always attached to an Entity. So I don’t need to find Component X in the graph.
When a Component is added, if the Entity it is attached to does not exist then it should be created.
If on upsert both the Component and Entity exist, then the value property of the Component should be updated.
I'm trying to write an efficient gremlin query for AWS Neptune.
https://docs.aws.amazon.com/neptune/latest/userguide/gremlin-efficient-upserts.html documents an optimization that Neptune makes, if properties are not set within coalesce. The following query accomplishes my design, but contains property set within the coalesce.
g.V('urn:aaid:sc:VA6C2:004ba5d7-5e1c-47a6-824a-0d0822e6415b/#head/#root')
.fold()
.coalesce(unfold(),
addV('Entity')
.property(id, 'urn:aaid:sc:VA6C2:004ba5d7-5e1c-47a6-824a-0d0822e6415b/#head/#root'))
.store('e1')
.in('ATTACHED_TO')
.has('component_id', 'DocumentProperties')
.fold()
.coalesce(unfold().property(single, 'value', '{"mimeType":"application/vnd.adobe.hz.express+dcx","docModelVersion":96,"draftDocumentModels":""}'),
addV('Component')
.property('component_id', 'DocumentProperties')
.property('value', '{"mimeType":"application/vnd.adobe.hz.express+dcx","docModelVersion":95,"draftDocumentModels":""}')
.addE('ATTACHED_TO').to(cap('e1').unfold()))
I've rewritten the query to remove property set within coalesce. I think I'm close, but can't quite seem to get a query that doesn't have some sort of syntax error.
g.V('urn:aaid:sc:VA6C2:004ba5d7-5e1c-47a6-824a-0d0822e6415b/#head/#root')
.fold()
.coalesce(unfold(),
addV('Entity')
.property(id, 'urn:aaid:sc:VA6C2:004ba5d7-5e1c-47a6-824a-0d0822e6415b/#head/#root'))
.store('entity')
.in('ATTACHED_TO')
.has('component_id', 'DocumentProperties')
.fold()
.coalesce(unfold(),
addV('Component')
.property('component_id', 'DocumentProperties'))
.property('value', '{"mimeType":"application/vnd.adobe.hz.express+dcx","docModelVersion":95,"draftDocumentModels":""}')
.outE('ATTACHED_TO')
.where(inV(cap('entity').unfold()))
.fold()
.coalesce(unfold(),
addE('ATTACHED_TO').to(cap('entity').unfold()))
There error is on the where statement. I haven't figured out how to express the where clause.
答案1
得分: 1
It's OK to set a property inside of the coalesce
as that does not return a property, Gremlin will still return the vertex that the property is applied to in that case. The case where the optimization breaks is if, for example, one part of the coalesce
returned a vertex, but the other returned a value such as constant(123)
. If the query you listed first is working for you it should be fine to use it. The Neptune /profile API
will tell you how much of a query is getting fully optimized.
英文:
It's OK to set a property inside of the coalesce
as that does not return a property, Gremlin will still return the vertex that the property is applied to in that case. The case where the optimization breaks is if, for example, one part of the coalesce
returned a vertex, but the other returned a value such as constant(123)
. If the query you listed first is working for you it should be fine to use it. The Neptune /profile API
will tell you how much of a query is getting fully optimized.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论