为什么Gremlin函数fold()影响JSON响应中的结果?

时间:2019-05-08 13:31:35

标签: gremlin amazon-neptune

折叠如何影响来自gremlin服务器的JSON输出?当我展开和折叠路径内容时,我得到了不同的数据结构,它添加了edge和vertex属性。虽然这是我的目标,也是要在路径中获取属性,但这似乎是奇怪的行为,我在文档中找不到此功能。

那为什么会发生这种情况?

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

g.V('1').out().path().by(unfold().fold())

当我运行以下查询时:g.V('1').out().path()

{
...
    {
      "@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": "1",
                "label": "USER"
              }
            },
            {
              "@type": "g:Vertex",
              "@value": {
                "id": "2",
                "label": "USER"
              }
            }
          ]
        }
      }
    }
...
}

但是当我g.V('1').out().path().by(unfold().fold())

{
...
  {
    "@type": "g:Path",
    "@value": {
      "labels": {
        "@type": "g:List",
        "@value": [
          {
            "@type": "g:Set",
            "@value": []
          },
          {
            "@type": "g:Set",
            "@value": []
          }
        ]
      },
      "objects": {
        "@type": "g:List",
        "@value": [
          {
            "@type": "g:List",
            "@value": [
              {
                "@type": "g:Vertex",
                "@value": {
                  "id": "1",
                  "label": "USER",
                  "properties": {
                    "prop1": [
                      {
                        "@type": "g:VertexProperty",
                        "@value": {
                          "id": {
                            "@type": "g:Int32",
                            "@value": 101839172
                          },
                          "value": {
                            "@type": "g:Int32",
                            "@value": 1
                          },
                          "label": "prop1"
                        }
                      }
                    ],
                    "created_at": [
                      {
                        "@type": "g:VertexProperty",
                        "@value": {
                          "id": {
                            "@type": "g:Int32",
                            "@value": 589742877
                          },
                          "value": {
                            "@type": "g:Date",
                            "@value": 1557226436119
                          },
                          "label": "created_at"
                        }
                      }
                    ]
                  }
                }
              }
            ]
          },
          {
            "@type": "g:List",
            "@value": [
              {
                "@type": "g:Vertex",
                "@value": {
                  "id": "2",
                  "label": "USER",
                  "properties": {
                    "prop1": [
                      {
                        "@type": "g:VertexProperty",
                        "@value": {
                          "id": {
                            "@type": "g:Int32",
                            "@value": -1354828672
                          },
                          "value": {
                            "@type": "g:Date",
                            "@value": 1557225020168
                          },
                          "label": "prop1"
                        }
                      }
                    ],
                    "created_at": [
                      {
                        "@type": "g:VertexProperty",
                        "@value": {
                          "id": {
                            "@type": "g:Int32",
                            "@value": 589742878
                          },
                          "value": {
                            "@type": "g:Date",
                            "@value": 1557226436119
                          },
                          "label": "created_at"
                        }
                      }
                    ]
                  }
                }
              }
            ]
          }
        ]
      }
    }
  }
...
}

编辑:其他信息,我发现除了fold()之外,我还可以使用project()identity()获得具有属性的整个实体。

因此,当我运行g.V('1').out().path().by(identity())时,得到的路径内容与第一个查询相同。

      "objects": {
        "@type": "g:List",
        "@value": [
        {
          "@type": "g:Vertex",
          "@value": {
            "id": "1",
            "label": "USER"
        }
        },
        {
          "@type": "g:Vertex",
          "@value": {
            "id": "2",
            "label": "USER"
        }
    }
  ]
}

但是当我运行g.V('1').out().path().by(project('identity').by(identity()))时,这就是我在路径中得到的(请注意properties对象):

"objects": {
    "@type": "g:List",
    "@value": [
        {
            "@type": "g:Map",
            "@value": [
                "identity",
                {
                    "@type": "g:Vertex",
                    "@value": {
                        "id": "1",
                        "label": "USER",
                        "properties": {
                            "prop1": [
                                {
                                    "@type": "g:VertexProperty",
                                    "@value": {
                                        "id": {
                                            "@type": "g:Int32",
                                            "@value": 101839172
                                        },
                                        "value": {
                                            "@type": "g:Int32",
                                            "@value": 1
                                        },
                                        "label": "prop1"
                                    }
                                }
                            ],
                            "created_at": [
                                {
                                    "@type": "g:VertexProperty",
                                    "@value": {
                                        "id": {
                                            "@type": "g:Int32",
                                            "@value": 589742877
                                        },
                                        "value": {
                                            "@type": "g:Date",
                                            "@value": 1557226436119
                                        },
                                        "label": "created_at"
                                    }
                                }
                            ],
                        }
                    }
                }
            ]
        }

1 个答案:

答案 0 :(得分:1)

从服务器返回的任何图形元素(即VertexEdgeVertexProperty)上都不应获得属性-仅由{{1 }}和id。因此,您在第一次遍历中看到的是正确的,而在第二次使用label时看到的是错误的。

这实际上是TinkerPop中的一个错误,我为此创建了TINKERPOP-2212

获得您想要的东西的正确方法是按照以下方式进行操作:

by(unfold().fold())

或者也许在最新版本的TinkerPop中,将gremlin> g.V(1).out().path().by(valueMap()) ==>[[name:[marko],age:[29]],[name:[lop],lang:[java]]] ==>[[name:[marko],age:[29]],[name:[vadas],age:[27]]] ==>[[name:[marko],age:[29]],[name:[josh],age:[32]]] gremlin> g.V(1).out().path().by(valueMap(true).by(unfold())) ==>[[id:1,label:person,name:marko,age:29],[id:3,label:software,name:lop,lang:java]] ==>[[id:1,label:person,name:marko,age:29],[id:2,label:person,name:vadas,age:27]] ==>[[id:1,label:person,name:marko,age:29],[id:4,label:person,name:josh,age:32]] 替换为:

valueMap(true)