Customer 360-Empfehlungsanwendungen mit BigQuery Graph erstellen

1. Einführung

In diesem Codelab erfahren Sie, wie Sie mit BigQuery Graph eine 360-Grad-Ansicht von Kunden und ein Empfehlungssystem für Cymbal Pets, ein fiktives Einzelhandelsunternehmen, erstellen. Sie nutzen die Leistungsfähigkeit von SQL, um Graphdaten direkt in BigQuery zu erstellen, abzufragen und zu analysieren und sie mit der Vektorsuche für erweiterte Produktempfehlungen zu kombinieren.

Mit BigQuery Graph können Sie Beziehungen zwischen Ihren Datenentitäten (z. B. Kunden, Produkte und Bestellungen) als Graph modellieren. So lassen sich komplexe Fragen zum Kundenverhalten und zu Produktpräferenzen ganz einfach beantworten.

Anwendungsfalldiagramm

Aufgaben

  • BigQuery-Dataset und -Schema für den Cymbal Pets-Graph erstellen
  • Beispieldaten (Kunden, Produkte, Bestellungen, Geschäfte) aus Cloud Storage laden
  • Eigenschaftsgraph in BigQuery erstellen, der diese Entitäten verbindet
  • Kaufhistorie von Kunden mit Graphabfragen visualisieren
  • Produktempfehlungssystem mit der Vektorsuche erstellen
  • Empfehlungen mit Graphbeziehungen vom Typ „Zusammen gekauft“ verbessern

Voraussetzungen

  • Ein Webbrowser wie Chrome
  • Ein Google Cloud-Projekt mit aktivierter Abrechnung

Dieses Codelab richtet sich an Entwickler aller Erfahrungsstufen, auch an Anfänger.

2. Hinweis

Google Cloud-Projekt erstellen

  1. Wählen Sie in der Google Cloud Console ein Google Cloud-Projekt aus oder erstellen Sie eines.
  2. Die Abrechnung für das Cloud-Projekt muss aktiviert sein.

Cloud Shell starten

  1. Klicken Sie oben in der Google Cloud Console auf Cloud Shell aktivieren.
  2. Authentifizierung überprüfen:
gcloud auth list
  1. Bestätigen Sie Ihr Projekt:
gcloud config get project
  1. Legen Sie es bei Bedarf fest:
export PROJECT_ID=<YOUR_PROJECT_ID>
gcloud config set project $PROJECT_ID

APIs aktivieren

Führen Sie diesen Befehl aus, um die erforderliche BigQuery API zu aktivieren:

gcloud services enable bigquery.googleapis.com

3. Schema definieren

Zuerst müssen Sie ein Dataset erstellen, um Ihre graphenbezogenen Tabellen zu speichern, und das Schema für Ihre Knoten und Kanten definieren.

  1. In diesem Codelab führen wir SQL-Befehle aus. Sie können diese Befehle im BigQuery Studio > SQL-Editor ausführen oder den bq query Befehl in Cloud Shell verwenden. Neue SQL-AbfrageWir gehen davon aus, dass Sie den BigQuery SQL-Editor verwenden, um mehrzeilige Erstellungsanweisungen besser verarbeiten zu können.
  2. Erstellen Sie das Dataset cymbal_pets_demo:
CREATE SCHEMA IF NOT EXISTS cymbal_pets_demo;
  1. Erstellen Sie die Tabellen für order_items, products, orders, stores, customers, und co_related_products_for_angelica. Diese Tabellen dienen als Quelldaten für unseren Graph.
CREATE TABLE IF NOT EXISTS cymbal_pets_demo.order_items
(
  order_id INT64,
  product_id INT64,
  order_item_id INT64,
  quantity INT64,
  price FLOAT64,
  PRIMARY KEY (order_id, product_id, order_item_id) NOT ENFORCED
)
CLUSTER BY order_item_id;

CREATE TABLE IF NOT EXISTS cymbal_pets_demo.products
(
  product_id INT64,
  product_name STRING,
  brand STRING,
  category STRING,
  subcategory INT64,
  animal_type INT64,
  search_keywords INT64,
  price FLOAT64,
  description STRING,
  inventory_level INT64,
  supplier_id INT64,
  average_rating FLOAT64,
  uri STRING,
  embedding ARRAY<FLOAT64>,
  PRIMARY KEY (product_id) NOT ENFORCED
)
CLUSTER BY product_id;

CREATE TABLE IF NOT EXISTS cymbal_pets_demo.orders
(
  customer_id INT64,
  order_id INT64,
  shipping_address_city STRING,
  store_id INT64,
  order_date DATE,
  order_type STRING,
  payment_method STRING,
  PRIMARY KEY (order_id) NOT ENFORCED
)
PARTITION BY order_date
CLUSTER BY order_id;

CREATE TABLE IF NOT EXISTS cymbal_pets_demo.stores
(
  store_id INT64,
  store_name STRING,
  address_state STRING,
  address_city STRING,
  latitude FLOAT64,
  longitude FLOAT64,
  opening_hours STRUCT<Monday STRING, Tuesday STRING, Wednesday STRING, Thursday STRING, Friday STRING, Saturday STRING, Sunday STRING>,
  manager_id INT64,
  PRIMARY KEY (store_id) NOT ENFORCED
)
CLUSTER BY store_id;

CREATE TABLE IF NOT EXISTS cymbal_pets_demo.customers
(
  customer_id INT64,
  first_name STRING,
  last_name STRING,
  email STRING,
  gender STRING,
  address_city STRING,
  address_state STRING,
  loyalty_member BOOL,
  PRIMARY KEY (customer_id) NOT ENFORCED
)
CLUSTER BY customer_id;

CREATE TABLE IF NOT EXISTS cymbal_pets_demo.co_related_products_for_angelica
(
  angelica_product_id INT64,
  other_product_id INT64,
  co_purchase_count INT64
);

Sie haben jetzt die Struktur für Ihre Graphdaten definiert.

4. Daten laden

Füllen Sie die Tabellen nun mit Beispieldaten aus Cloud Storage.

Führen Sie die folgenden LOAD DATA-Anweisungen im BigQuery SQL-Editor aus:

LOAD DATA INTO `cymbal_pets_demo.customers`
FROM FILES (
    format = 'AVRO',
    uris = ['gs://sample-data-and-media/cymbal-pets/tables/customers/*.avro']
);

LOAD DATA INTO `cymbal_pets_demo.order_items`
FROM FILES (
    format = 'AVRO',
    uris = ['gs://sample-data-and-media/cymbal-pets/tables/order_items/*.avro']
);

LOAD DATA INTO `cymbal_pets_demo.orders`
FROM FILES (
    format = 'AVRO',
    uris = ['gs://sample-data-and-media/cymbal-pets/tables/orders/*.avro']
);

LOAD DATA INTO `cymbal_pets_demo.products`
FROM FILES (
    format = 'AVRO',
    uris = ['gs://sample-data-and-media/cymbal-pets/tables/products/*.avro']
);

LOAD DATA INTO `cymbal_pets_demo.stores`
FROM FILES (
    format = 'AVRO',
    uris = ['gs://sample-data-and-media/cymbal-pets/tables/stores/*.avro']
);

Sie sollten eine Bestätigung sehen, dass Zeilen in jede Tabelle geladen wurden.

5. Eigenschaftsgraph erstellen

Nachdem die Daten geladen wurden, können Sie jetzt den Eigenschaftsgraph definieren. Dadurch wird BigQuery mitgeteilt, welche Tabellen Knoten (Entitäten wie Kunden, Produkte) und welche Tabellen Kanten (Beziehungen wie „Besucht“, „Platziert“, „Hat“) darstellen.

Graph-Schema

Führen Sie die folgende DDL-Anweisung aus:

CREATE OR REPLACE PROPERTY GRAPH cymbal_pets_demo.PetsOrderGraph
NODE TABLES (
  cymbal_pets_demo.customers KEY(customer_id) LABEL Customer,
  cymbal_pets_demo.products KEY(product_id) LABEL Products,
  cymbal_pets_demo.stores KEY(store_id) LABEL Stores,
  cymbal_pets_demo.orders KEY(order_id) LABEL Orders
)
EDGE TABLES (
  cymbal_pets_demo.orders as customer_to_store_edge
    KEY (order_id)
    SOURCE KEY (customer_id) references customers(customer_id)
    DESTINATION KEY (store_id) references stores(store_id)
    LABEL Visited
    PROPERTIES ALL COLUMNS,

  cymbal_pets_demo.order_items
    KEY (order_item_id)
    SOURCE KEY (order_id) references orders(order_id)
    DESTINATION KEY (product_id) references products(product_id)
    LABEL Has
    PROPERTIES ALL COLUMNS,

  cymbal_pets_demo.orders as customer_to_orders_edge
    KEY (order_id)
    SOURCE KEY (customer_id) references customers(customer_id)
    DESTINATION KEY (order_id) references orders(order_id)
    LABEL Placed
    PROPERTIES ALL COLUMNS,

  cymbal_pets_demo.co_related_products_for_angelica
    KEY (angelica_product_id)
    SOURCE KEY (angelica_product_id) references products(product_id)
    DESTINATION KEY (other_product_id) references products(product_id)
    LABEL BoughtTogether
    PROPERTIES ALL COLUMNS
);

Dadurch wird der Graph PetsOrderGraph erstellt, mit dem wir Graphdurchläufe mit dem Operator GRAPH_TABLE ausführen können.

6. Kaufhistorie aller Kunden visualisieren

Öffnen Sie in BigQuery Studio Neues Notebook.

Neues Notebook erstellen

Für die Visualisierungs- und Empfehlungsteile dieses Codelabs verwenden wir ein Google Colab -Notebook in BigQuery Studio. So können wir die Graphergebnisse ganz einfach visualisieren.

Fügen Sie Folgendes in eine Codezelle ein:

!pip install bigquery-magics==0.12.1

Das BigQuery Graph-Notebook wird als IPython-Magic-Befehl implementiert. Wenn Sie den Magic-Befehl %%bigquery mit der Funktion TO_JSON hinzufügen, können Sie die Ergebnisse wie in den folgenden Abschnitten gezeigt visualisieren.

Angenommen, Cymbal Pets möchte eine 360-Grad-Visualisierung aller Kunden und ihrer Käufe in einem bestimmten Zeitraum erhalten.

Führen Sie Folgendes in einer neuen Zelle aus:

%%bigquery --graph

GRAPH cymbal_pets_demo.PetsOrderGraph
  # finds the customer node and then finds all
  # the Orders nodes that are connected to that customer through the
  # Placed relationship
  MATCH (customer:Customer)-[placed:Placed]->(ordr:Orders)-[has:Has]->(product:Products)
  # filters the Orders nodes to only include those where the
  # order_date is within the last 3 months.
  WHERE ordr.order_date >= date('2024-11-27')
  # # This line finds all the Products nodes that are connected to the
  # # filtered Orders nodes through the Has relationship.
  MATCH p=(customer:Customer)-[placed:Placed]->(ordr:Orders)-[has:Has]->(product:Products)
  LIMIT 40
  RETURN 
    TO_JSON(p) as paths

Sie sollten eine visuelle Darstellung des Graphergebnisses sehen.

Bisherige Käufe aller Kunden

7. Kaufhistorie von Angelica visualisieren

Angenommen, Cymbal Pets möchte sich genauer mit einer Kundin namens Angelica Russell befassen. Das Unternehmen möchte die Produkte analysieren, die Angelica in den letzten drei Monaten gekauft hat, und die Geschäfte, die sie besucht hat.

%%bigquery --graph

GRAPH cymbal_pets_demo.PetsOrderGraph
  # finds the customer node with the name "Angelica Russell" and then finds all
  # the Orders nodes that are connected to that customer through the
  # Placed relationship and all the Products nodes that are connected to the
  # filtered Orders nodes through the Has relationship.
   MATCH p=(customer:Customer {first_name: 'Angelica', last_name: 'Russell'})-[placed:Placed]->(ordr:Orders)-[has:Has]->(product:Products)
  # filters the Orders nodes to only include those where the
  # order_date is within the last 3 months.
  WHERE ordr.order_date >= date('2024-11-27')
  # finds the Stores nodes where Angelica placed order from
  MATCH p2=(customer)-[visited:Visited]->(store:Stores)
  RETURN
    TO_JSON(p) as path, TO_JSON(p2) as path2

Bisherige Käufe von Angelica

8. Produktempfehlung mit der Vektorsuche

Cymbal Pets möchte Angelica Produkte empfehlen, die auf ihren letzten Käufen basieren. Mit der Vektorsuche können wir Produkte mit ähnlichen Einbettungen wie ihre bisherigen Käufe finden.

Führen Sie das folgende SQL-Skript in einer neuen Colab-Zelle aus. Dieses Skript:

  1. Identifiziert Produkte, die Angelica kürzlich gekauft hat.
  2. Verwendet VECTOR_SEARCH, um die vier ähnlichsten Produkte aus der Tabelle products zu finden.

Hinweis: Bei diesem Schritt wird davon ausgegangen, dass Sie bereits AI.GENERATE_EMBEDDINGS ausgeführt haben, um eine Einbettungsspalte in der Tabelle „products“ zu erstellen.

%%bigquery
DECLARE products_bought_by_angelica ARRAY<INT64>;

-- 1. Get IDs of products bought by Angelica
SET products_bought_by_angelica = (
  SELECT ARRAY_AGG(product_id) FROM
   GRAPH_TABLE(
    cymbal_pets_demo.PetsOrderGraph
      MATCH (c:Customer {first_name: 'Angelica', last_name: 'Russell'})-[placed:Placed]->(o:Orders)
      WHERE o.order_date >= date('2024-11-27')
      MATCH (o)-[has_edge:Has]->(p:Products)
      RETURN DISTINCT p.product_id as product_id
  ));

-- 2. Find similar products using vector search
SELECT 
  query.product_name as AngelicaBought, 
  base.product_name as RecommendedProducts, 
  base.category
FROM
  VECTOR_SEARCH(
    TABLE cymbal_pets_demo.products,
    'embedding',
    (SELECT * FROM cymbal_pets_demo.products
     WHERE product_id IN UNNEST(products_bought_by_angelica)),
    'embedding',
    top_k => 4)
WHERE query.product_name <> base.product_name;

Sie sollten eine Liste mit empfohlenen Produkten sehen, die semantisch ähnlich zu dem sind, was Angelica gekauft hat.

Ergebnisse der Vektorsuche

9. Empfehlung mit Beziehungen vom Typ „Zusammen gekauft“

Eine weitere leistungsstarke Empfehlungstechnik ist die kollaborative Filterung. Dabei werden Produkte empfohlen, die häufig von anderen Nutzern zusammen gekauft werden. Wir haben dies als BoughtTogether-Kante in unserem Graph modelliert.

Um Produkte zu empfehlen, die zusammen gekauft wurden, hat Cymbal Pets eine analytische Offline-Graphabfrage ausgeführt, um die besten Produkte zu finden, die für jedes von Angelica gekaufte Produkt empfohlen werden können.

%%bigquery
CREATE OR REPLACE TABLE cymbal_pets_demo.co_related_products_for_angelica AS
SELECT
    angelica_product_id,
    other_product_id,
    co_purchase_count
FROM (
    SELECT
        angelicaProduct.product_id AS angelica_product_id,
        otherProduct.product_id AS other_product_id,
        count(otherProduct) AS co_purchase_count,
        # ensures that the row numbering is done separately for each angelica_product_id
        ROW_NUMBER() OVER (PARTITION BY angelicaProduct.product_id ORDER BY count(otherProduct) DESC) AS rn
    FROM
        GRAPH_TABLE (cymbal_pets_demo.PetsOrderGraph
          MATCH (angelica:Customer {first_name: 'Angelica', last_name: 'Russell'})-[:Placed]->(o:Orders)-[:Has]->(angelicaProduct:Products)
          WHERE o.order_date >= date('2024-11-27')
          WITH angelica, angelicaProduct
          MATCH (otherCustomer:Customer)-[:Placed]->(otherOrder:Orders)-[:Has]->(angelicaProduct) # Find orders where Angelica's products were bought
          WHERE otherCustomer <> angelica # Exclude Angelica's own orders
          WITH angelicaProduct, otherOrder
          MATCH (otherOrder)-[:HAS]->(otherProduct:Products) # Find other products in those orders
          WHERE angelicaProduct <> otherProduct # Exclude the original product.
          RETURN angelicaProduct, otherProduct, otherOrder
        )
    GROUP BY
        angelicaProduct.product_id, otherProduct.product_id
)
WHERE rn <= 3; # only keep top 3 co-related products

Empfehlungslogik

Führen Sie diese Abfrage aus, um Produkte zu empfehlen, die über die Kante BoughtTogether direkt mit den Käufen von Angelica verbunden sind:

%%bigquery
SELECT * FROM GRAPH_TABLE(
  cymbal_pets_demo.PetsOrderGraph
  MATCH (customer:Customer {first_name: 'Angelica', last_name: 'Russell'})-[placed:Placed]->(ordr:Orders)
  WHERE ordr.order_date >= date('2024-11-27')
  MATCH (ordr)-[has:Has]->(product:Products)
  MATCH (product)-[bought_together:BoughtTogether]->(recommended_product:Products)
  RETURN 
    product.product_name AS OriginalProduct,
    recommended_product.product_name AS Recommended,
    bought_together.co_purchase_count AS Strength
);

Diese Abfrage durchläuft die Knoten „Customer“ -> „Order“ -> „Product“ -> „(BoughtTogether)“ -> „Recommended Product“ und zeigt Empfehlungen basierend auf dem kollektiven Kaufverhalten.

Zusammen gekauft

10. Bereinigen

Löschen Sie die in diesem Codelab erstellten Ressourcen, um laufende Kosten für Ihr Google Cloud-Konto zu vermeiden.

Dataset und alle Tabellen löschen:

DROP SCHEMA IF EXISTS cymbal_pets_demo CASCADE;

Wenn Sie für dieses Codelab ein neues Projekt erstellt haben, können Sie es auch löschen:

gcloud projects delete $PROJECT_ID

11. Glückwunsch

Glückwunsch! Sie haben mit BigQuery Graph erfolgreich eine 360-Grad-Ansicht von Kunden und ein Empfehlungssystem erstellt.

Das haben Sie gelernt

  • Eigenschaftsgraph in BigQuery erstellen.
  • Daten in Graphknoten und -kanten laden.
  • Graphmuster mit GRAPH_TABLE und MATCH abfragen.
  • Graphabfragen mit der Vektorsuche für hybride Empfehlungen kombinieren.

Nächste Schritte