我试图从AWS海王星数据库检索树层次结构。我使用下面的查询来检索JSON格式的数据
g.V().hasLabel(labelid.toLowerCase()).has("name", "Val oswalt").repeat(__.inE().outV()).emit()
.tree().by(__.valueMap("name")).toList();
返回如下json格式的数据。
[
{
"{name=[Val oswalt]}": {
"{}": {
"{name=[Stan Polomoski]}": {
"{}": {
"{name=[MC Regan]}": {}
}
}
}
}
}
]
是否有可能以适当的json格式或Flare json格式返回数据,如以下
{
"name": "Val oswalt",
"children": [
{
"name": "Stan Polomoski",
"children": [
{
"name": "MC Regan"
}
]
}
]
}
很难使用Gremlin将tree()
结果转换为它提供的基础结构以外的任何东西,因为使用Gremlin对返回的Tree
进行后期处理以递归地将父/子对转换为新的键/值对将会在您的查询中添加大量不可读的代码。
这有点奇怪,你的结果返回看起来像String
表示的Map
,你通过做valueMap('name')
得到。除非您使用的是不支持Map
值作为键的编程语言中的Gremlin,否则我希望您可以在那里获得可以使用的实际Map
对象。
说了这么多,基于你的输出目标,看起来你可以更接近这种形式(而不会过度复杂化你的Gremlin),通过这样做:
g.V().hasLabel(labelid.toLowerCase()).
has("name", "Val oswalt").
repeat(__.in()).emit().
tree().
by("name")
应该产生如下内容:
{
"Val oswalt": [
{
"Stan Polomoski": [
{
"MC Regan": []
}
]
}
]
}
虽然不是完全相同的输出,但它绝对更干净,并且意味着相同的结构。如果您只是必须拥有所请求的结构,我强烈建议您使用我建议的修改后的查询,然后在应用程序中对结果进行后处理,以获得该结构,从而使Gremlin保持简单。Gremlin几乎可以做任何事情,但即使是出于学术目的,我也不认为写这个查询是值得的。