Почему функция Gremlin fold () влияет на результат в ответе JSON? - PullRequest
0 голосов
/ 08 мая 2019

Как свертывание влияет на вывод JSON с сервера gremlin?Я получаю другую структуру данных, когда раскрываю и складываю содержимое пути, это добавляет свойства ребра и вершины.Хотя это моя цель, чтобы получить свойства в пути, но это кажется странным поведением, и я не мог найти об этой функциональности в документах.

Так почему же это происходит?

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()), я получаю следующее содержимое Path, такое же, как первый запрос.

      "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())), это то, что я получаю в пути (обратите внимание на объект свойств):

"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 Ответ

1 голос
/ 09 мая 2019

Вы никогда не должны получать свойства какого-либо элемента графа (т. Е. Vertex, Edge или VertexProperty), возвращаемого с сервера - только «ссылка», состоящая из id и label. Итак, то, что вы видите в первом обходе, является правильным, а то, что вы видите во втором, который использует by(unfold().fold()), неверно.

На самом деле это ошибка в TinkerPop, для которой я создал TINKERPOP-2212 .

Правильный способ получить то, что вы хотите, это сделать что-то вроде:

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]]

или, возможно, в последних версиях TinkerPop, замените valueMap(true) на:

gremlin> g.V(1).out().path().by(valueMap().by(unfold()).with(WithOptions.tokens))
==>[[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]]
...