templates/Lambda4AppSyncGraphSDK/index.mjs (89 lines of code) (raw):
import {ExecuteQueryCommand, NeptuneGraphClient} from "@aws-sdk/client-neptune-graph";
import {resolveGraphDBQueryFromAppSyncEvent, initSchema} from './output.resolver.graphql.js';
import {readFileSync} from "fs";
const PROTOCOL = 'https';
const QUERY_LANGUAGE = 'OPEN_CYPHER';
const RESOLVER_LANGUAGE = 'opencypher';
let client;
function getClient() {
if (!client) {
try {
log('Instantiating NeptuneGraphClient')
client = new NeptuneGraphClient({
port: process.env.NEPTUNE_PORT,
host: process.env.NEPTUNE_DOMAIN,
region: process.env.NEPTUNE_REGION,
protocol: PROTOCOL,
});
} catch (error) {
return onError('Error instantiating NeptuneGraphClient: ', error);
}
}
return client;
}
function onError(context, error) {
let msg;
if (error) {
msg = context + ':' + error.message;
} else {
msg = context;
}
console.error(msg);
if (error) {
throw error;
}
throw new Error(msg);
}
function log(message) {
if (process.env.LOGGING_ENABLED) {
console.log(message);
}
}
/**
* Converts graphQL query to open cypher.
*/
function resolveGraphQuery(event) {
try {
const schemaDataModelJSON = readFileSync('output.resolver.schema.json', 'utf-8');
let schemaModel = JSON.parse(schemaDataModelJSON);
initSchema(schemaModel);
let resolver = resolveGraphDBQueryFromAppSyncEvent(event);
if (resolver.language !== RESOLVER_LANGUAGE) {
return onError('Unsupported resolver language:' + resolver.language)
}
log('Resolved ' + resolver.language + ' query successfully');
return resolver;
} catch (error) {
return onError('Error resolving graphQL query', error);
}
}
/**
* Converts incoming graphQL query into open cypher format and sends the query to neptune analytics query API.
*/
export const handler = async (event) => {
let resolver = resolveGraphQuery(event);
try {
const command = new ExecuteQueryCommand({
graphIdentifier: process.env.NEPTUNE_DB_NAME,
queryString: resolver.query,
language: QUERY_LANGUAGE,
parameters: resolver.parameters
});
const response = await getClient().send(command);
log('Received query response');
let data = await new Response(response.payload).json();
// query result should have result array of single item or an empty array
// {"results": [{ ... }]}
if (data.results.length === 0) {
log('Query produced no results');
return [];
}
if (data.results.length !== 1) {
return onError('Expected 1 query result but received ' + data.results.length);
}
log('Obtained data from query response');
return data.results[0][Object.keys(data.results[0])[0]];
} catch (error) {
return onError('Error executing ' + QUERY_LANGUAGE + ' query: ', error);
}
};