OrientDB查询时如何将关联顶点及边字段嵌入另一个顶点结构
实现方案
完全可以实现该查询需求,你可以结合OrientDB的MATCH语句和内置Map操作函数完成动态字段拼接,以下是可用的查询语句:
MATCH {class: Activity, as: act} -Has{as: has_edge}-> {class: User, as: u} RETURN act.* exclude field_values, mapMerge( act.field_values, map(has_edge.field_id, u) ) AS field_values
语法说明
- MATCH段匹配完整的
Activity->Has->User路径,分别给Activity、Has边、User设置别名 - 用
map()函数动态生成以边的field_id为键、完整User顶点为值的单键Map - 用
mapMerge()函数把Activity原有的field_values和上面生成的动态Map合并,得到你需要的结构 - 投影段用
act.* exclude field_values保留Activity所有原生字段,仅替换field_values为合并后的结果,完全符合你给出的返回格式要求 - 如果单条Activity关联了多条Has边,该语句也会自动把所有边对应的键值对合并到
field_values中
如果你需要永久修改存储的Activity数据而不仅仅是查询返回转换后的结果,可以用以下UPDATE语句:
UPDATE Activity SET field_values = mapMerge( field_values, map( outE('Has').field_id[0], out('Has')[0] ) ) WHERE @rid = '#28:0'
如果一条Activity对应多个Has边,可以用循环逻辑批量处理所有关联边:
LET $act = SELECT FROM Activity WHERE @rid = '#28:0' LIMIT 1; LET $edges = SELECT expand(outE('Has')) FROM $act; FOREACH $e IN $edges { UPDATE $act SET field_values = mapMerge(field_values, map($e.field_id, $e.inV())) }
内容的提问来源于stack exchange,提问作者Samuele
相关产品推荐
相关产品推荐

