#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}),
};
}