как сохранить данные в aws neptune db с помощью node js?

#node.js #gremlin #amazon-neptune

#node.js #гремлин #amazon-нептун

Вопрос:

Есть ли способ сохранить данные в Amazon aws neptune db с использованием node js? Я запускаю этот код на лямбде.

Я установил соединение с базой данных neptune, используя приведенный ниже код.

const gremlin = require(‘гремлин’);

 const DriverRemoteConnection = gremlin.driver.DriverRemoteConnection;
const Graph = gremlin.structure.Graph;

dc = new DriverRemoteConnection('endpoint',{});

const graph = new Graph();
const g = graph.traversal().withRemote(dc);
  

Ответ №1:

Вот лямбда-функция JavaScript, которая записывает данные в Neptune (и переносит запись в блок повторных попыток в случае одновременных изменений). Функция получает конечную точку Neptune и порт из переменных среды. Запрос на запись находится в query() методе. Это простой пример upsert, который пытается создать вершину, используя случайно сгенерированный идентификатор. Если вершина с таким идентификатором уже существует, запрос возвращает эту вершину, а не создает новую.

В этом примере создается единственное соединение, которое сохраняется в течение всего срока службы лямбда-контейнера (а не для каждого вызова). В коде повторной попытки есть некоторая проверка ошибок, которая воссоздает соединение в случае нежелательной проблемы с сетью.

 const gremlin = require('gremlin');
const async = require('async');

const traversal = gremlin.process.AnonymousTraversalSource.traversal;
const DriverRemoteConnection = gremlin.driver.DriverRemoteConnection;

let conn = createRemoteConnection();
let g = createGraphTraversalSource(conn);
const t = gremlin.process.t;
const __ = gremlin.process.statics;

async function query(id) {
    return g.V(id)
        .fold()
        .coalesce(
            __.unfold(), 
            __.addV('User').property(t.id, id)
        )
        .id().next();
}


exports.handler = async (event, context) => {

    const id = Math.floor(Math.random() * 10000).toString();
    
    return async.retry(
        { 
            times: 5,
            interval: 1000,
            errorFilter: function (err) { 
                
                // Add filters here to determine whether error can be retried
                console.warn('Determining whether retriable error: '   err.message);
                
                // Check for connection issues
                if (err.message.startsWith('WebSocket is not open')){
                    console.warn('Reopening connection');
                    conn.close();
                    conn = createRemoteConnection();
                    g = createGraphTraversalSource(conn);
                    return true;
                }
                
                // Check for ConcurrentModificationException
                if (err.message.includes('ConcurrentModificationException')){
                    console.warn('Retrying query because of ConcurrentModificationException');
                    return true;
                }
                
                return false; 
            }
            
        }, 
        async function (cb) { 
            let result = await query(id); 
            return result['value'];
        });
};

function createRemoteConnection() {
        
    return new DriverRemoteConnection(
        connectionString(), 
        { 
            mimeType: 'application/vnd.gremlin-v2.0 json', 
            pingEnabled: false 
        });
}

function createGraphTraversalSource(conn) {
    return traversal().withRemote(conn);
}

function connectionString() {
    return 'wss://'   
        process.env['neptuneEndpoint']   
        ':'   
        process.env['neptunePort']   
        '/gremlin';
}
  

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

1. Я использовал это. Теперь я получаю ошибку, как показано ниже Ошибка: не удается найти модуль ‘async’. Должен ли я добавить какие-либо дополнительные импорта?

2. Это было решено после установки npm. Приведенный ниже код, который вы упомянули выше, ничего не возвращает. верните g.V(id) .fold() .coalesce( __.unfold(), __.addV(‘User’).property(t.id , id) ) .id().next(); Не могли бы вы, пожалуйста, помочь мне с этим?

3. Используя Node v12.18.2, я построил свой пример со следующими зависимостями: async 3.2.0, async-limiter 1.0.1, gremlin 3.4.7 и ws 6.2.1. Убедитесь, что функция Lambda запущена в том же VPC, что и ваш кластер Neptune, и с группой безопасности, которая может получить доступ к Neptune.

4. Я хочу знать, где я могу проверить загрузки в консоли aws, где я создал новую записную книжку для просмотра данных

Ответ №2:

Простая демонстрация, основанная на документации TinkerPop

 const handler = async (event) => {
    // add person vertex with a property name and value stephen.
    await g.addV('person').property('name','stephen').next();

    // fetch all vertex' and get the name properties.
    const result = await g.V().values('name').toList();
    console.log(result);

    return {
        statusCode: 201,
        body: JSON.stringify({message:"Testing Gremlin!", data:result}),
    };
}