4

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

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 查询,以便它在图中嵌套顶点属性。请注意,当我只运行 gV("customerId") 时,响应确实包含这些属性。

4

1 回答 1

15

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

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]
于 2018-07-26T20:30:01.727 回答