Condividi tramite


Avvio rapido: Libreria client di Azure Cosmos DB for Apache Gremlin per Node.js

Importante

Si sta cercando una soluzione di database per scenari su larga scala con un contratto di servizio di disponibilità 99.999%, scalabilità automatica immediata e failover automatico in più aree? Prendere in considerazione Azure Cosmos DB per NoSQL.

Si vuole implementare un grafico OLAP (Online Analytical Processing) o eseguire la migrazione di un'applicazione Apache Gremlin esistente? Considera Graph in Microsoft Fabric.

Inizia a utilizzare la libreria client di Azure Cosmos DB per Apache Gremlin per Node.js per archiviare, gestire e interrogare i dati non strutturati. Seguire la procedura descritta in questa guida per creare un nuovo account, installare una libreria client Node.js, connettersi all'account, eseguire operazioni comuni ed eseguire query sui dati di esempio finali.

Codice sorgente della libreria | Pacchetto (npm)

Prerequisiti

  • Una sottoscrizione di Azure

    • Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.
  • Node.js 22 o versione successiva

Configurazione

Prima di tutto, configurare l'account e l'ambiente di sviluppo per questa guida. Questa sezione illustra il processo di creazione di un account, il recupero delle credenziali e la preparazione dell'ambiente di sviluppo.

Crea un account

Per iniziare, creare un'API per l'account Apache Gremlin. Dopo aver creato l'account, creare il database e le risorse del grafo.

  1. Se non si ha già un gruppo di risorse di destinazione, usare il az group create comando per creare un nuovo gruppo di risorse nella sottoscrizione.

    az group create \
        --name "<resource-group-name>" \
        --location "<location>"
    
  2. Usare il az cosmosdb create comando per creare un nuovo account Azure Cosmos DB per Apache Gremlin con le impostazioni predefinite.

    az cosmosdb create \
        --resource-group "<resource-group-name>" \
        --name "<account-name>" \
        --locations "regionName=<location>" \
        --capabilities "EnableGremlin"
    
  3. Crea un nuovo database con nome az cosmosdb gremlin database create utilizzando cosmicworks.

    az cosmosdb gremlin database create \
        --resource-group "<resource-group-name>" \
        --account-name "<account-name>" \
        --name "cosmicworks"
    
  4. Usare il az cosmosdb gremlin graph create comando per creare un nuovo grafo denominato products.

    az cosmosdb gremlin graph create \
        --resource-group "<resource-group-name>" \
        --account-name "<account-name>" \
        --database-name "cosmicworks" \
        --name "products" \
        --partition-key-path "/category"
    

Ottenere le credenziali

Ottenere ora la password per la libreria client da usare per creare una connessione all'account creato di recente.

  1. Usare az cosmosdb show per recuperare l'host dell'account.

    az cosmosdb show \
        --resource-group "<resource-group-name>" \
        --name "<account-name>" \
        --query "{host:name}"
    
  2. Registrare il valore della host proprietà dall'output dei comandi precedenti. Il valore di questa proprietà è l'host che utilizzerai più avanti in questa guida per connetterti all'account tramite la libreria.

  3. Usare az cosmosdb keys list per ottenere le chiavi per l'account.

    az cosmosdb keys list \
        --resource-group "<resource-group-name>" \
        --name "<account-name>" \
        --type "keys"
    
  4. Registrare il valore della primaryMasterKey proprietà dall'output dei comandi precedenti. Il valore di questa proprietà è la chiave usata più avanti in questa guida per connettersi all'account con la libreria.

Preparare l'ambiente di sviluppo

Configurare quindi l'ambiente di sviluppo con un nuovo progetto e la libreria client. Questo passaggio è l'ultimo prerequisito necessario prima di passare al resto di questa guida.

  1. Iniziare in una cartella vuota.

  2. Inizializzare un nuovo modulo.

    npm init es6 --yes
    
  3. Installare il gremlin pacchetto da Node Package Manager (npm).

    npm install --save gremlin
    
  4. Creare il file index.js .

  1. Iniziare in una cartella vuota.

  2. Inizializzare un nuovo modulo.

    npm init es6 --yes
    
  3. Installare il typescript pacchetto da Node Package Manager (npm).

    npm install --save-dev typescript
    
  4. Installare il tsx pacchetto da npm.

    npm install --save-dev tsx
    
  5. Installare il gremlin pacchetto da npm.

    npm install --save gremlin
    
  6. Installare il @types/node pacchetto da npm.

    npm install --save-dev @types/node
    
  7. Installare il @types/gremlin pacchetto da npm.

    npm install --save-dev @types/gremlin
    
  8. Inizializzare il progetto TypeScript usando il compilatore (tsc).

    npx tsc --init --target es2017 --module es2022 --moduleResolution nodenext
    
  9. Creare il file index.ts .

Modello a oggetti

Descrizione
DriverRemoteConnection Rappresenta la connessione al server Gremlin
GraphTraversalSource Usato per costruire ed eseguire attraversamenti Gremlin

Esempi di codice

Autenticare il client

Per iniziare, autenticare il client usando le credenziali raccolte in precedenza in questa guida.

  1. Aprire il file index.js nell'ambiente di sviluppo integrato (IDE).

  2. Importare il gremlin pacchetto e i tipi richiesti:

    import gremlin from 'gremlin';
    const { Client, auth } = gremlin.driver;
    const { PlainTextSaslAuthenticator } = auth;
    
  3. Creare variabili stringa per le credenziali raccolte in precedenza in questa guida. Nomina le variabili hostname e primaryKey.

    const hostname = '<host>';
    const primaryKey = '<key>';
    
  4. Creare un oggetto di tipo PlainTextSaslAuthenticator usando le credenziali e le variabili di configurazione create nei passaggi precedenti. Archiviare l'oggetto in una variabile denominata authenticator.

    const authenticator = new PlainTextSaslAuthenticator(
        '/dbs/cosmicworks/colls/products',
        primaryKey
    );
    
  5. Creare un Client oggetto usando la variabile authenticator. Assegnare alla variabile il nome client.

    const client = new Client(
        `wss://${hostname}.gremlin.cosmos.azure.com:443/`,
        {
            authenticator,
            traversalsource: 'g',
            rejectUnauthorized: true,
            mimeType: 'application/vnd.gremlin-v2.0+json'
        }
    );
    
  1. Aprire il file index.ts nell'ambiente di sviluppo integrato (IDE).

  2. Importare il gremlin pacchetto e i tipi richiesti:

    import gremlin from 'gremlin';
    const { Client, auth } = gremlin.driver;
    const { PlainTextSaslAuthenticator } = auth;
    
  3. Creare variabili stringa per le credenziali raccolte in precedenza in questa guida. Nomina le variabili hostname e primaryKey.

    const hostname: string = '<host>';
    const primaryKey: string = '<key>';
    
  4. Creare un oggetto di tipo PlainTextSaslAuthenticator usando le credenziali e le variabili di configurazione create nei passaggi precedenti. Archiviare l'oggetto in una variabile denominata authenticator.

    const authenticator = new PlainTextSaslAuthenticator(
        '/dbs/cosmicworks/colls/products',
        primaryKey
    );
    
  5. Creare un Client oggetto usando la variabile authenticator. Assegnare alla variabile il nome client.

    const client = new Client(
        `wss://${hostname}.gremlin.cosmos.azure.com:443/`,
        {
            authenticator,
            traversalsource: 'g',
            rejectUnauthorized: true,
            mimeType: 'application/vnd.gremlin-v2.0+json'
        }
    );
    

Immettere dati

Inserire quindi i nuovi dati dei vertici e dei bordi nel grafico. Prima di creare i nuovi dati, cancellare il grafico di tutti i dati esistenti.

  1. Eseguire la g.V().drop() query per cancellare tutti i vertici e i bordi dal grafico.

    await client.submit('g.V().drop()');
    
  2. Creare una query Gremlin che aggiunge un vertice.

    const insert_vertex_query = `
        g.addV('product')
            .property('id', prop_id)
            .property('name', prop_name)
            .property('category', prop_category)
            .property('quantity', prop_quantity)
            .property('price', prop_price)
            .property('clearance', prop_clearance)
    `;
    
  3. Aggiungere un vertice per un singolo prodotto.

    await client.submit(insert_vertex_query, {
        prop_id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb',
        prop_name: 'Yamba Surfboard',
        prop_category: 'gear-surf-surfboards',
        prop_quantity: 12,
        prop_price: 850.00,
        prop_clearance: false,
    });
    
  4. Aggiungere altri due vertici per due prodotti aggiuntivi.

    await client.submit(insert_vertex_query, {
        prop_id: 'bbbbbbbb-1111-2222-3333-cccccccccccc',
        prop_name: 'Montau Turtle Surfboard',
        prop_category: 'gear-surf-surfboards',
        prop_quantity: 5,
        prop_price: 600.00,
        prop_clearance: true,
    });
    
    await client.submit(insert_vertex_query, {
        prop_id: 'cccccccc-2222-3333-4444-dddddddddddd',
        prop_name: 'Noosa Surfboard',
        prop_category: 'gear-surf-surfboards',
        prop_quantity: 31,
        prop_price: 1100.00,
        prop_clearance: false,
    });
    
  5. Creare un'altra query Gremlin che aggiunge un arco.

    const insert_edge_query = `
        g.V([prop_partition_key, prop_source_id])
            .addE('replaces')
            .to(g.V([prop_partition_key, prop_target_id]))
    `;
    
  6. Aggiungere due bordi.

    await client.submit(insert_edge_query, {
        prop_partition_key: 'gear-surf-surfboards',
        prop_source_id: 'bbbbbbbb-1111-2222-3333-cccccccccccc',
        prop_target_id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb',
    });
    
    await client.submit(insert_edge_query, {
        prop_partition_key: 'gear-surf-surfboards',
        prop_source_id: 'bbbbbbbb-1111-2222-3333-cccccccccccc',
        prop_target_id: 'cccccccc-2222-3333-4444-dddddddddddd',
    });
    
  1. Eseguire la g.V().drop() query per cancellare tutti i vertici e i bordi dal grafico.

    await client.submit('g.V().drop()');
    
  2. Creare una query Gremlin che aggiunge un vertice.

    const insert_vertex_query: string = `
        g.addV('product')
            .property('id', prop_id)
            .property('name', prop_name)
            .property('category', prop_category)
            .property('quantity', prop_quantity)
            .property('price', prop_price)
            .property('clearance', prop_clearance)
    `;
    
  3. Aggiungere un vertice per un singolo prodotto.

    await client.submit(insert_vertex_query, {
        prop_id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb',
        prop_name: 'Yamba Surfboard',
        prop_category: 'gear-surf-surfboards',
        prop_quantity: 12,
        prop_price: 850.00,
        prop_clearance: false,
    });
    
  4. Aggiungere altri due vertici per due prodotti aggiuntivi.

    await client.submit(insert_vertex_query, {
        prop_id: 'bbbbbbbb-1111-2222-3333-cccccccccccc',
        prop_name: 'Montau Turtle Surfboard',
        prop_category: 'gear-surf-surfboards',
        prop_quantity: 5,
        prop_price: 600.00,
        prop_clearance: true,
    });
    
    await client.submit(insert_vertex_query, {
        prop_id: 'cccccccc-2222-3333-4444-dddddddddddd',
        prop_name: 'Noosa Surfboard',
        prop_category: 'gear-surf-surfboards',
        prop_quantity: 31,
        prop_price: 1100.00,
        prop_clearance: false,
    });
    
  5. Creare un'altra query Gremlin che aggiunge un arco.

    const insert_edge_query: string = `
        g.V([prop_partition_key, prop_source_id])
            .addE('replaces')
            .to(g.V([prop_partition_key, prop_target_id]))
    `;
    
  6. Aggiungere due bordi.

    await client.submit(insert_edge_query, {
        prop_partition_key: 'gear-surf-surfboards',
        prop_source_id: 'bbbbbbbb-1111-2222-3333-cccccccccccc',
        prop_target_id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb',
    });
    
    await client.submit(insert_edge_query, {
        prop_partition_key: 'gear-surf-surfboards',
        prop_source_id: 'bbbbbbbb-1111-2222-3333-cccccccccccc',
        prop_target_id: 'cccccccc-2222-3333-4444-dddddddddddd',
    });
    

Leggere dati

Leggere quindi i dati inseriti in precedenza nel grafico.

  1. Creare una query che legge un vertice usando l'identificatore univoco e il valore della chiave di partizione.

    const read_vertex_query = 'g.V([prop_partition_key, prop_id])';
    
  2. Leggere quindi un vertice specificando i parametri obbligatori.

    let read_results = await client.submit(read_vertex_query, {
        prop_partition_key: 'gear-surf-surfboards',
        prop_id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb',
    });
    
    let matched_item = read_results._items[0];
    
  1. Creare una query che legge un vertice usando l'identificatore univoco e il valore della chiave di partizione.

    const read_vertex_query: string = 'g.V([prop_partition_key, prop_id])';
    
  2. Leggere quindi un vertice specificando i parametri obbligatori.

    let read_results = await client.submit(read_vertex_query, {
        prop_partition_key: 'gear-surf-surfboards',
        prop_id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb',
    });
    
    let matched_item = read_results._items[0];
    

Dati di query

Usare infine una query per trovare tutti i dati corrispondenti a un attraversamento o un filtro specifico nel grafico.

  1. Creare una query che individui tutti i vertici che si diramano da un vertice specifico.

    const find_vertices_query = `
        g.V().hasLabel('product')
            .has('category', prop_partition_key)
            .has('name', prop_name)
            .outE('replaces').inV()
    `;
    
  2. Eseguire la query che specifica il Montau Turtle Surfboard prodotto.

    let find_results = await client.submit(find_vertices_query, {
        prop_partition_key: 'gear-surf-surfboards',
        prop_name: 'Montau Turtle Surfboard',
    });
    
  3. Scorrere i risultati della query.

    for (const item of find_results._items) {
        // Do something here with each result
    }
    
  1. Creare una query che individui tutti i vertici che si diramano da un vertice specifico.

    const find_vertices_query: string = `
        g.V().hasLabel('product')
            .has('category', prop_partition_key)
            .has('name', prop_name)
            .outE('replaces').inV()
    `;
    
  2. Eseguire la query che specifica il Montau Turtle Surfboard prodotto.

    let find_results = await client.submit(find_vertices_query, {
        prop_partition_key: 'gear-surf-surfboards',
        prop_name: 'Montau Turtle Surfboard',
    });
    
  3. Scorrere i risultati della query.

    for (const item of find_results._items) {
        // Do something here with each result
    }
    

Eseguire il codice

Eseguire l'applicazione appena creata usando un terminale nella directory dell'applicazione.

node index.js
npx tsx index.ts

Pulire le risorse

Quando l'account non è più necessario, rimuovere l'account dalla sottoscrizione di Azure eliminando la risorsa.

az cosmosdb delete \
    --resource-group "<resource-group-name>" \
    --name "<account-name>"