как сохранить данные в базе данных aws neptune с помощью узла js?

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

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

const гремлин = требуют('гремлин');

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

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

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

person JhansiRani Kolapalli    schedule 15.09.2020    source источник


Ответы (2)


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

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

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';
}
person Ian Robinson    schedule 15.09.2020
comment
Я использовал это. Теперь я получаю сообщение об ошибке, как показано ниже. Ошибка: не удается найти модуль «асинхронный». Должен ли я добавить дополнительный импорт? - person JhansiRani Kolapalli; 15.09.2020
comment
Это было решено после установки npm. Приведенный ниже код, который вы упомянули выше, ничего не возвращает. return g.V(id) .fold() .coalesce( __.unfold(), __.addV('Пользователь').property(t.id, id)) .id().next(); Не могли бы вы помочь мне с этим? - person JhansiRani Kolapalli; 15.09.2020
comment
Используя 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. - person Ian Robinson; 15.09.2020
comment
Я хочу знать, где я могу проверить загрузки в консоли aws, где я создал новый блокнот для просмотра данных. - person JhansiRani Kolapalli; 17.09.2020

Простая демонстрация на основе документации 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}),
    };
}
person Rbulmer55    schedule 06.01.2021