Creare ed eseguire query su un grafo
Questo documento mostra come utilizzare BigQuery Graph per creare un grafo con informazioni finanziarie ed eseguire query sui grafi utilizzando il Graph Query Language (GQL).
Ruoli obbligatori
Per ottenere le autorizzazioni necessarie per lavorare con i grafi, chiedi all'amministratore di concederti il ruolo IAM Editor dati BigQuery (roles/bigquery.dataEditor) sul set di dati in cui crei le tabelle dei nodi, le tabelle dei bordi e il grafo.
Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.
Questo ruolo predefinito contiene le autorizzazioni necessarie per lavorare con i grafi. Per vedere quali sono esattamente le autorizzazioni richieste, espandi la sezione Autorizzazioni obbligatorie:
Autorizzazioni obbligatorie
Per lavorare con i grafi sono necessarie le seguenti autorizzazioni:
-
Crea un grafo:
bigquery.propertyGraphs.create -
Elenca i grafi e i relativi metadati:
bigquery.propertyGraphs.list -
Ottieni i metadati e la definizione di un grafo:
bigquery.propertyGraphs.get -
Aggiorna i metadati e la definizione di un grafo:
bigquery.propertyGraphs.update -
Elimina un grafo:
bigquery.propertyGraphs.delete
Potresti anche ottenere queste autorizzazioni con ruoli personalizzati o altri ruoli predefiniti.
Creare tabelle dei nodi e dei bordi
I grafi vengono creati da tabelle BigQuery esistenti e archiviati nei set di dati.
Per archiviare le tabelle e il grafo che crei negli esempi seguenti,
crea un set di dati.
La seguente query crea un set di dati denominato graph_db:
CREATE SCHEMA IF NOT EXISTS graph_db;
Le seguenti tabelle contengono informazioni su persone e account, nonché sulle relazioni tra ciascuna di queste entità:
Person: informazioni sulle persone.Account: informazioni sui conti bancari.PersonOwnAccount: informazioni su chi possiede quali account.AccountTransferAccount: informazioni sui trasferimenti tra account.
Per creare queste tabelle, esegui le seguenti
CREATE TABLE istruzioni:
CREATE OR REPLACE TABLE graph_db.Person (
id INT64,
name STRING,
birthday TIMESTAMP,
country STRING,
city STRING,
PRIMARY KEY (id) NOT ENFORCED
);
CREATE OR REPLACE TABLE graph_db.Account (
id INT64,
create_time TIMESTAMP,
is_blocked BOOL,
nick_name STRING,
PRIMARY KEY (id) NOT ENFORCED
);
CREATE OR REPLACE TABLE graph_db.PersonOwnAccount (
id INT64 NOT NULL,
account_id INT64 NOT NULL,
create_time TIMESTAMP,
PRIMARY KEY (id, account_id) NOT ENFORCED,
FOREIGN KEY (id) REFERENCES graph_db.Person(id) NOT ENFORCED,
FOREIGN KEY (account_id) REFERENCES graph_db.Account(id) NOT ENFORCED
);
CREATE OR REPLACE TABLE graph_db.AccountTransferAccount (
id INT64 NOT NULL,
to_id INT64 NOT NULL,
amount FLOAT64,
create_time TIMESTAMP NOT NULL,
order_number STRING,
PRIMARY KEY (id, to_id, create_time) NOT ENFORCED,
FOREIGN KEY (id) REFERENCES graph_db.Account(id) NOT ENFORCED,
FOREIGN KEY (to_id) REFERENCES graph_db.Account(id) NOT ENFORCED
);
Creare un grafo
Per creare un grafo, puoi utilizzare l'
CREATE PROPERTY GRAPHistruzione
o il modellatore di grafi visivo.
L'esempio seguente utilizza l'istruzione CREATE PROPERTY GRAPH per creare un grafo denominato FinGraph nel set di dati graph_db. Le tabelle Account e Person sono le tabelle dei nodi. Le tabelle AccountTransferAccount e PersonOwnAccount sono le tabelle dei bordi, che rappresentano le relazioni tra le tabelle dei nodi.
CREATE OR REPLACE PROPERTY GRAPH graph_db.FinGraph
NODE TABLES (
graph_db.Account,
graph_db.Person
)
EDGE TABLES (
graph_db.PersonOwnAccount
SOURCE KEY (id) REFERENCES Person (id)
DESTINATION KEY (account_id) REFERENCES Account (id)
LABEL Owns,
graph_db.AccountTransferAccount
SOURCE KEY (id) REFERENCES Account (id)
DESTINATION KEY (to_id) REFERENCES Account (id)
LABEL Transfers
);
Inserire i dati
Per aggiornare i dati in un grafo, aggiorna i dati nelle tabelle dei nodi e dei bordi. Quando crei un grafo, i dati non vengono spostati o copiati. Un grafo funge invece da visualizzazione logica dei dati esistenti nelle tabelle dei nodi e dei bordi. Le query sui grafi restituiscono risultati in base ai dati esistenti nelle tabelle dei nodi e dei bordi al momento dell'esecuzione della query.
La seguente query inserisce i dati nelle tabelle che hai creato:
INSERT INTO graph_db.Account
(id, create_time, is_blocked, nick_name)
VALUES
(7,"2020-01-10 06:22:20.222",false,"Vacation Fund"),
(16,"2020-01-27 17:55:09.206",true,"Vacation Fund"),
(20,"2020-02-18 05:44:20.655",false,"Rainy Day Fund");
INSERT INTO graph_db.Person
(id, name, birthday, country, city)
VALUES
(1,"Alex","1991-12-21 00:00:00","Australia","Adelaide"),
(2,"Dana","1980-10-31 00:00:00","Czech_Republic","Moravia"),
(3,"Lee","1986-12-07 00:00:00","India","Kollam");
INSERT INTO graph_db.AccountTransferAccount
(id, to_id, amount, create_time, order_number)
VALUES
(7,16,300,"2020-08-29 15:28:58.647","304330008004315"),
(7,16,100,"2020-10-04 16:55:05.342","304120005529714"),
(16,20,300,"2020-09-25 02:36:14.926","103650009791820"),
(20,7,500,"2020-10-04 16:55:05.342","304120005529714"),
(20,16,200,"2020-10-17 03:59:40.247","302290001255747");
INSERT INTO graph_db.PersonOwnAccount
(id, account_id, create_time)
VALUES
(1,7,"2020-01-10 06:22:20.222"),
(2,20,"2020-01-27 17:55:09.206"),
(3,16,"2020-02-18 05:44:20.655");

Eseguire query su un grafo
Per eseguire query su un grafo, esegui query che utilizzano il Graph Query Language.
La seguente query utilizza un'istruzione
MATCH
per trovare informazioni su a chi Dana ha trasferito denaro:
GRAPH graph_db.FinGraph
MATCH
(person:Person {name: "Dana"})-[own:Owns]->
(account:Account)-[transfer:Transfers]->(account2:Account)<-[own2:Owns]-(person2:Person)
RETURN
person.name AS owner,
transfer.amount AS amount,
person2.name AS transferred_to
ORDER BY person2.name;
I risultati sono simili ai seguenti:
+-------+--------+----------------+ | owner | amount | transferred_to | +-------+--------+----------------+ | Dana | 500.0 | Alex | | Dana | 200.0 | Lee | +-------+--------+----------------+
Puoi anche utilizzare i grafi come origine dati in analisi conversazionale, che ti consente di porre domande in linguaggio naturale sui grafi. Ad esempio, potresti chiedere "A chi ha trasferito denaro Dana e quanto è stato trasferito?"
Visualizzare i risultati delle query sui grafi
Puoi
visualizzare i risultati delle query sui grafi
in un notebook utilizzando il comando magico %%bigquery --graph seguito dalla query
GQL. La query deve restituire gli elementi del grafo in formato JSON. Per visualizzare i risultati della query eseguita nella sezione precedente, esegui la seguente query in una cella di codice del notebook:
%%bigquery --graph
GRAPH graph_db.FinGraph
MATCH
p = ((person:Person {name: "Dana"})-[own:Owns]->
(account:Account)-[transfer:Transfers]->(acount2:Account)<-[own2:Owns]-(person2:Person))
RETURN
TO_JSON(p) AS path;

Eliminare un grafo
Per eliminare un grafo, utilizza l'istruzione DROP PROPERTY GRAPH statement. L'eliminazione di un grafo non ha alcun effetto sulle tabelle utilizzate per definire i nodi e i bordi del grafo. La seguente query elimina il grafo FinGraph:
DROP PROPERTY GRAPH graph_db.FinGraph;
Passaggi successivi
- Consulta l' introduzione a BigQuery Graph.
- Scopri di più sugli schemi dei grafi.
- Scopri di più su come scrivere query sui grafi.
- Scopri di più sul Graph Query Language (GQL).
- Per un tutorial sul rilevamento delle frodi, consulta Rilevamento delle frodi con BigQuery Graph.
- Per un tutorial sui profili cliente, consulta Creare consigli a 360 gradi sui clienti con BigQuery Graph.
- Per un tutorial sulle catene di fornitura, consulta Tracciabilità della catena di fornitura con BigQuery Graph.