【问题标题】:How to collect all vertex and edge properties along path, with Gremlin如何使用 Gremlin 沿路径收集所有顶点和边缘属性
【发布时间】:2019-01-03 22:16:11
【问题描述】:

这是一个非常简单的查询:

g.V('customerId').out().path()

这个的JSON输出是

{  
   "requestId":"96b26c1d-d032-2004-d36e-c700bd6db2a2",
   "status":{  
      "message":"",
      "code":200,
      "attributes":{  
         "@type":"g:Map",
         "@value":[  

         ]
      }
   },
   "result":{  
      "data":{  
         "@type":"g:List",
         "@value":[  
            {  
               "@type":"g:Path",
               "@value":{  
                  "labels":{  
                     "@type":"g:List",
                     "@value":[  
                        {  
                           "@type":"g:Set",
                           "@value":[  

                           ]
                        },
                        {  
                           "@type":"g:Set",
                           "@value":[  

                           ]
                        }
                     ]
                  },
                  "objects":{  
                     "@type":"g:List",
                     "@value":[  
                        {  
                           "@type":"g:Vertex",
                           "@value":{  
                              "id":"customerId",
                              "label":"customer"
                           }
                        },
                        {  
                           "@type":"g:Vertex",
                           "@value":{  
                              "id":"e:customerIdemail@email.com",
                              "label":"email"
                           }
                        }
                     ]
                  }
               }
            }
         ]
      },
      "meta":{  
         "@type":"g:Map",
         "@value":[  

         ]
      }
   }
}

现在,客户顶点还包含属性名称和年龄。我想了解的是如何(如果可能的话)形成我的 gremlin 查询,以便它在图中嵌套顶点属性。请注意,当我只运行 g.V("customerId") 时,响应确实包含这些属性。

【问题讨论】:

    标签: gremlin tinkerpop amazon-neptune


    【解决方案1】:

    您应该始终准确地指定要在遍历中返回的数据。即使是这样简单的事情:

    g.V('customerId')
    

    你应该更喜欢:

    g.V('customerId').valueMap('name','age')
    

    在你可能不会做的 SQL 中确实没有什么不同

    SELECT * FROM customer
    

    而是

    SELECT name, age FROM customer
    

    至于你的问题,你只需要指定你想要返回的数据,所以使用by()调制器为path()

    g.V('customerId').
      out().
      path().
        by(valueMap('name','age'))
    

    这当然假设您的out() 也是“客户”,如果不是,只需添加第二个by() 并包含所需的特定字段。 by() 调制器以循环方式应用。如果您希望处理更简洁的 JSON 格式,您可以改用 project(),例如:

    g.V('customerId').
      out().
      path().
        by(project('name','age').
             by('name').
             by('age'))
    

    因为这将杀死 valueMap() 添加的嵌入列表以正确考虑多属性。

    从 TinkerPop 3.4.4 开始,您还可以考虑 elementMap()-step,其中包含更多图形元素的结构。

    gremlin> g.V().has('person','name','marko').elementMap()
    ==>[id:1,label:person,name:marko,age:29]
    gremlin> g.V().has('person','name','marko').elementMap('name')
    ==>[id:1,label:person,name:marko]
    gremlin> g.V().has('person','name','marko').properties('name').elementMap()
    ==>[id:0,key:name,value:marko]
    gremlin> g.E(11).elementMap()
    ==>[id:11,label:created,IN:[id:3,label:software],OUT:[id:4,label:person],weight:0.4]
    

    【讨论】:

    • 有没有办法将此数据包含在 gList 的顶点或边类型中?您给我的查询添加会返回 g:Map 中的所有内容
    • 您应该在返回数据时查看标准集合。这又回到了我的观点,即明确返回的内容。没有图形元素的“部分”概念(即返回 Vertex 仅具有一些属性),正如您在查询中看到的那样,我们将“分离”该顶点,以便您得到的只是 id/label .我们将这种形式的顶点称为“参考”顶点,并且在未来,TinkerPop 将返回所有遍历(在某些图形实现和 TinkerPop 序列化程序中已经以这种方式工作)。
    • 如果您想知道为什么我们认为“完整”顶点“不好”,您必须考虑多属性。想象一个带有一百万个属性的顶点,而您不小心在path() 中返回了未过滤的那个 - 这将是一个昂贵的序列化日来返回该结果
    • 好的。很公平。感谢您向我解释这一点。我还有一个问题:如何在“project(...)”中添加顶点 ID?我尝试只添加一个参数“id”,但这似乎不起作用。根据我们的实现,将地图解组为顶点属性是相当简单的,但如果没有主键,我无法识别映射属性所引用的顶点。
    • 它只是by(T.id) 或者只是by(id) 如果T 是静态导入的
    猜你喜欢
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多