如何使用 Gremlin 沿路径收集所有顶点和边属性
How to collect all vertex and edge properties along path, with Gremlin
这是一个非常简单的查询:
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") 时,响应确实包含这些属性。
您应该始终准确指定要在遍历中返回的数据。即使是像这样简单的事情:
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()
也是一个 "customer",如果不是,只需添加第二个 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]
这是一个非常简单的查询:
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") 时,响应确实包含这些属性。
您应该始终准确指定要在遍历中返回的数据。即使是像这样简单的事情:
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()
也是一个 "customer",如果不是,只需添加第二个 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]