Gremlin — Как вернуть свойство ребра вместе с результатом узла?

#node.js #gremlin #graph-databases #tinkerpop #tinkerpop3

Вопрос:

Я хотел бы знать, как добавить в результат свойство ребра, которое связывает узел с другим узлом

Я использую node.js для выполнения запросов к базе данных Neptune через Gremlin. Затем я отправляю результат в Javascript через API.

 let data = [];
const id_vertex = "1"
data = await g.V().has(id,id_vertex)
        .out()

        .valueMap()

        .with_('~tinkerpop.valueMap.tokens'))

        .toList();
 

Вот как выглядят данные:

 [

  {

    name: [ 'Colt Bogan II' ],

    label: 'User',

    notification: [ 'Both' ],

    usercity: [ 'Wardburgh' ],

    id: '1',

    RegisteredDate: [ '2010-10-14' ]

  },

  {

    name: [ 'Webster Sanford' ],

    label: 'User',

    notification: [ 'SMS' ],

    usercity: [ 'Nanniefurt' ],

    id: '2',

    RegisteredDate: [ '2006-02-03' ]

  }

]
 

Затем я использую JSON.stringify, чтобы создать текст того, что я отправляю обратно в javascript

 body: JSON.stringify(data)
 
 "body": 
"[{"name":["Colt Bogan II"],"label":"User","notification":["Both"],"usercity":["Wardburgh"],"id":"1","RegisteredDate":["2010-10-14"]},
{"name":["Webster Sanford"],"label":"User","notification":["SMS"],"usercity":["Nanniefurt"],"id":"2","RegisteredDate":["2006-02-03"]}]"
 

Я хотел бы добавить свойство ребра, которое соединяет мой узел с идентификатором id_vertex, с другим узлом (при возврате всех свойств этого узла) в теле. Либо пока я делаю запрос Гремлина, либо после этого. Допустим, что свойство края, которое меня интересует, — это цвет, тогда, в конце концов, тело, которое я хотел бы выглядеть так:

 "body": 
"[{"edgeColor":["Green"], "name":["Colt Bogan II"],"label":"User","notification":["Both"],"usercity":["Wardburgh"],"id":"1","RegisteredDate":["2010-10-14"]},
{"edgeColor":["Blue"], "name":["Webster Sanford"],"label":"User","notification":["SMS"],"usercity":["Nanniefurt"],"id":"2","RegisteredDate":["2006-02-03"]}]"
 

Кроме того, у меня есть максимум одно ребро от одного узла к другому, если это поможет

Ответ №1:

Если вы немного измените свой запрос, вы можете включить свойства ребра в результат.

 let data = [];
const id_vertex = "1"

data = await g.V().has(id,id_vertex)
        .outE()
        .project('edge','vertex')
           .by(valueMap('edgeColor'))
           .by(inV().valueMap().with_('~tinkerpop.valueMap.tokens'))
        .toList();
 

Комментарии:

1. Большое спасибо! Если бы edgeColor был значением (например, 10, 20), вы также знаете, как я мог бы вернуть результат, упорядоченный в порядке убывания?

2. неважно, теперь я знаю, как это сделать

3. Я рад, что у тебя все получилось. Я был бы признателен, если бы вы приняли ответ, если бы он сработал для вас, чтобы другие могли видеть, что проблема решена. Большое спасибо.