1. Introduction
Dans cet atelier de programmation, vous allez apprendre à utiliser BigQuery Graph pour modéliser et analyser un réseau d'interactions entre des médicaments et des cibles. Vous utiliserez la puissance des requêtes de graphe (GQL) pour explorer l'interaction des médicaments avec les cibles biologiques, identifier les effets secondaires potentiels (comme les risques cardiaques) et découvrir des thérapies combinées potentielles.
🧬 Cas d'utilisation : réseau d'interaction médicament-cible
Question métier : Quel est le rayon d'action complet d'un composé ? Quelles cibles lie-t-il, quelles voies biologiques sont affectées et quelles zones de maladie sont impliquées ?
Tables :
Table | Description |
| Molécules de médicaments avec mécanisme d'action et stade de développement |
| Protéines cibles avec noms de gènes et ID UniProt |
| Affinité de liaison composé-cible (cibles principales et hors cible) |
| Voies biologiques avec associations de zones de maladie |
| Table de jonction reliant les cibles aux voies auxquelles elles participent |
Modèle de graphe de propriétés :
(Compound)-[BINDS_TO {affinity_nm, ic50_nm, interaction_type}]->(Target)
(Target)-[PARTICIPATES_IN {role, importance_score}]->(Pathway)

🔍 Exemples de requêtes
Requête | Description |
Q1 : Profil de liaison cible | Traversée en un saut : composé vers toutes les cibles principales et hors cible |
Q2 : Détection du risque cardiaque hERG | Traversée en deux sauts : composé → cible hERG → voie cardiaque |
T3 : Paires de composés à cible partagée | Correspondance bidirectionnelle : deux composés convergent vers le même nœud cible |
Q4 : Potentiel néfaste de la voie de la maladie | Agrégation à deux sauts : couverture complète des voies et des zones de maladie par composé |
Q5 : Sélection d'un composé sûr | Composés présentant une couverture oncologique élevée, mais sans risque cardiaque hERG |
Objectifs de l'atelier
- Créer un ensemble de données et un schéma BigQuery pour le réseau d'interactions médicamenteuses
- Charger des exemples de données (composés, cibles, interactions, voies, voies cibles)
- Créer un graphe de propriétés dans BigQuery reliant ces entités
- Interrogez le graphe pour comprendre les interactions entre les composés, les voies biologiques et le rayon d'action des maladies à l'aide de parcours de graphe (
GRAPH_TABLEetMATCH). - Comparez GQL et le SQL standard côte à côte pour comprendre la simplicité et la puissance d'expression de la syntaxe des graphes.
Prérequis
- Un navigateur Web (par exemple, Chrome)
- Un projet Google Cloud avec facturation activée
Cet atelier de programmation s'adresse aux développeurs de tous niveaux, y compris aux débutants.
2. Avant de commencer
Créer un projet Google Cloud
- Dans la console Google Cloud, sélectionnez ou créez un projet Google Cloud.
- Assurez-vous que la facturation est activée pour votre projet Cloud.
Démarrer Cloud Shell
- Cliquez sur Activer Cloud Shell en haut de la console Google Cloud.
- Vérifiez l'authentification :
gcloud auth list
- Confirmez votre projet :
gcloud config get project
- Définissez-la si nécessaire :
export PROJECT_ID=<YOUR_PROJECT_ID>
gcloud config set project $PROJECT_ID
Activer les API
Exécutez la commande suivante pour activer l'API BigQuery requise :
gcloud services enable bigquery.googleapis.com
3. Définir le schéma et charger les données
Vous devez d'abord créer un ensemble de données pour stocker vos tables liées au graphe et les remplir avec des exemples de données.
- Accédez à BigQuery Studio dans la console Google Cloud.
- Cliquez sur Éditeur SQL pour ouvrir un nouvel onglet de requête.
- Exécutez l'instruction suivante pour créer l'ensemble de données
drug_target_graph:
CREATE SCHEMA IF NOT EXISTS drug_target_graph
OPTIONS (location = 'US');
Créez maintenant les cinq tables sources en exécutant les requêtes LDD suivantes dans BigQuery Studio.
1. Créer une table compounds
Contient des molécules de médicaments, leur mécanisme d'action, leur stade de développement et leur domaine thérapeutique.
CREATE OR REPLACE TABLE drug_target_graph.compounds AS
SELECT 'CPD001' AS compound_id, 'Imatinib' AS compound_name, 'Kinase Inhibitor' AS mechanism_of_action, 'Approved' AS dev_stage, 'Oncology' AS therapeutic_area, 479.6 AS molecular_weight UNION ALL
SELECT 'CPD002', 'Gefitinib', 'Kinase Inhibitor', 'Approved', 'Oncology', 446.9 UNION ALL
SELECT 'CPD003', 'Erlotinib', 'Kinase Inhibitor', 'Approved', 'Oncology', 393.4 UNION ALL
SELECT 'CPD004', 'Sorafenib', 'Multi-Kinase Inhibitor', 'Approved', 'Oncology', 464.8 UNION ALL
SELECT 'CPD005', 'Vemurafenib', 'BRAF Inhibitor', 'Approved', 'Oncology', 489.9 UNION ALL
SELECT 'CPD006', 'Crizotinib', 'ALK Inhibitor', 'Approved', 'Oncology', 450.3 UNION ALL
SELECT 'CPD007', 'Idelalisib', 'PI3K Inhibitor', 'Approved', 'Oncology', 415.4 UNION ALL
SELECT 'CPD008', 'Trametinib', 'MEK Inhibitor', 'Approved', 'Oncology', 615.4 UNION ALL
SELECT 'CPD009', 'Palbociclib', 'CDK Inhibitor', 'Approved', 'Oncology', 447.5 UNION ALL
SELECT 'CPD010', 'Compound-X1', 'Kinase Inhibitor', 'Phase II', 'Oncology', 412.3 UNION ALL
SELECT 'CPD011', 'Compound-X2', 'PI3K Inhibitor', 'Phase I', 'Oncology', 398.7 UNION ALL
SELECT 'CPD012', 'Saquinavir', 'Protease Inhibitor', 'Approved', 'Infectious Disease', 670.8 UNION ALL
SELECT 'CPD013', 'Metformin', 'AMPK Activator', 'Approved', 'Metabolic', 165.6 UNION ALL
SELECT 'CPD014', 'Rapamycin', 'mTOR Inhibitor', 'Approved', 'Immunology', 914.2 UNION ALL
SELECT 'CPD015', 'Compound-X3', 'Multi-Kinase Inhibitor', 'Preclinical', 'Oncology', 502.1;
2. Créer une table targets
Contient des cibles protéiques, des noms de gènes, des ID UniProt et des classes cibles.
CREATE OR REPLACE TABLE drug_target_graph.targets AS
SELECT 'TGT001' AS target_id, 'BCR-ABL1' AS target_name, 'ABL1' AS gene_name, 'P00519' AS uniprot_id, 'Kinase' AS target_class, TRUE AS is_oncogene UNION ALL
SELECT 'TGT002', 'EGFR', 'EGFR', 'P00533', 'Kinase', TRUE UNION ALL
SELECT 'TGT003', 'VEGFR2', 'KDR', 'P35968', 'Kinase', FALSE UNION ALL
SELECT 'TGT004', 'BRAF', 'BRAF', 'P15056', 'Kinase', TRUE UNION ALL
SELECT 'TGT005', 'ALK', 'ALK', 'Q9UM73', 'Kinase', TRUE UNION ALL
SELECT 'TGT006', 'PI3K-alpha','PIK3CA', 'P42336', 'Lipid Kinase', TRUE UNION ALL
SELECT 'TGT007', 'MEK1', 'MAP2K1', 'Q02750', 'Kinase', FALSE UNION ALL
SELECT 'TGT008', 'CDK4', 'CDK4', 'P11802', 'Kinase', FALSE UNION ALL
SELECT 'TGT009', 'CDK6', 'CDK6', 'P30279', 'Kinase', FALSE UNION ALL
SELECT 'TGT010', 'mTOR', 'MTOR', 'P42345', 'Kinase', FALSE UNION ALL
SELECT 'TGT011', 'PDGFR-beta','PDGFRB', 'P09619', 'Kinase', FALSE UNION ALL
SELECT 'TGT012', 'c-KIT', 'KIT', 'P10721', 'Kinase', TRUE UNION ALL
SELECT 'TGT013', 'hERG', 'KCNH2', 'Q12809', 'Ion Channel', FALSE UNION ALL
SELECT 'TGT014', 'AMPK', 'PRKAA1', 'Q13131', 'Kinase', FALSE UNION ALL
SELECT 'TGT015', 'RAF1', 'RAF1', 'P04049', 'Kinase', FALSE UNION ALL
SELECT 'TGT016', 'RET', 'RET', 'P07949', 'Kinase', TRUE UNION ALL
SELECT 'TGT017', 'FLT3', 'FLT3', 'P36888', 'Kinase', TRUE UNION ALL
SELECT 'TGT018', 'AKT1', 'AKT1', 'P31749', 'Kinase', FALSE UNION ALL
SELECT 'TGT019', 'ERK2', 'MAPK1', 'P28482', 'Kinase', FALSE UNION ALL
SELECT 'TGT020', 'HIV-Protease','HIV1-PR','Q72547', 'Protease', FALSE;
3. Créer une table interactions
Contient des données d'affinité de liaison composé-cible (cibles principales par rapport aux cibles secondaires).
CREATE OR REPLACE TABLE drug_target_graph.interactions AS
SELECT 'INT001' AS interaction_id, 'CPD001' AS compound_id, 'TGT001' AS target_id, 0.025 AS affinity_nm, 0.038 AS ic50_nm, 'primary' AS interaction_type, 9.8 AS pchembl_value UNION ALL
SELECT 'INT002', 'CPD001', 'TGT011', 0.1, 0.15, 'primary', 8.8 UNION ALL
SELECT 'INT003', 'CPD001', 'TGT012', 0.068, 0.1, 'primary', 9.2 UNION ALL
SELECT 'INT004', 'CPD001', 'TGT016', 0.5, 0.8, 'off-target', 7.4 UNION ALL
SELECT 'INT005', 'CPD001', 'TGT013', 5.2, 8.1, 'off-target', 6.1 UNION ALL
SELECT 'INT006', 'CPD002', 'TGT002', 0.02, 0.033, 'primary', 9.7 UNION ALL
SELECT 'INT007', 'CPD002', 'TGT013', 3.1, 4.8, 'off-target', 6.5 UNION ALL
SELECT 'INT008', 'CPD003', 'TGT002', 0.058, 0.079, 'primary', 9.2 UNION ALL
SELECT 'INT009', 'CPD003', 'TGT013', 8.5, 12.0, 'off-target', 5.9 UNION ALL
SELECT 'INT010', 'CPD004', 'TGT003', 0.09, 0.12, 'primary', 9.1 UNION ALL
SELECT 'INT011', 'CPD004', 'TGT004', 0.038, 0.055, 'primary', 8.9 UNION ALL
SELECT 'INT012', 'CPD004', 'TGT015', 0.22, 0.31, 'primary', 8.5 UNION ALL
SELECT 'INT013', 'CPD004', 'TGT016', 0.58, 0.75, 'primary', 8.1 UNION ALL
SELECT 'INT014', 'CPD004', 'TGT017', 0.33, 0.48, 'primary', 8.4 UNION ALL
SELECT 'INT015', 'CPD004', 'TGT013', 2.8, 4.1, 'off-target', 6.6 UNION ALL
SELECT 'INT016', 'CPD005', 'TGT004', 0.031, 0.044, 'primary', 9.5 UNION ALL
SELECT 'INT017', 'CPD005', 'TGT015', 0.48, 0.65, 'off-target', 7.3 UNION ALL
SELECT 'INT018', 'CPD006', 'TGT005', 0.02, 0.028, 'primary', 9.8 UNION ALL
SELECT 'INT019', 'CPD006', 'TGT003', 0.41, 0.59, 'off-target', 7.4 UNION ALL
SELECT 'INT020', 'CPD007', 'TGT006', 0.019, 0.025, 'primary', 9.8 UNION ALL
SELECT 'INT021', 'CPD007', 'TGT018', 0.55, 0.78, 'off-target', 7.2 UNION ALL
SELECT 'INT022', 'CPD008', 'TGT007', 0.0092, 0.014, 'primary', 10.1 UNION ALL
SELECT 'INT023', 'CPD008', 'TGT019', 0.38, 0.51, 'off-target', 7.4 UNION ALL
SELECT 'INT024', 'CPD009', 'TGT008', 0.011, 0.017, 'primary', 9.9 UNION ALL
SELECT 'INT025', 'CPD009', 'TGT009', 0.015, 0.022, 'primary', 9.8 UNION ALL
SELECT 'INT026', 'CPD010', 'TGT002', 0.041, 0.058, 'primary', 9.4 UNION ALL
SELECT 'INT027', 'CPD010', 'TGT001', 0.38, 0.52, 'off-target', 7.3 UNION ALL
SELECT 'INT028', 'CPD010', 'TGT013', 1.2, 1.8, 'off-target', 7.1 UNION ALL
SELECT 'INT029', 'CPD011', 'TGT006', 0.029, 0.041, 'primary', 9.5 UNION ALL
SELECT 'INT030', 'CPD011', 'TGT010', 0.71, 0.95, 'off-target', 7.0 UNION ALL
SELECT 'INT031', 'CPD012', 'TGT020', 0.39, 0.55, 'primary', 7.3 UNION ALL
SELECT 'INT032', 'CPD013', 'TGT014', 12.0, 18.5, 'primary', 5.7 UNION ALL
SELECT 'INT033', 'CPD014', 'TGT010', 0.0018, 0.0025, 'primary', 11.8 UNION ALL
SELECT 'INT034', 'CPD015', 'TGT004', 0.055, 0.078, 'primary', 9.2 UNION ALL
SELECT 'INT035', 'CPD015', 'TGT003', 0.12, 0.17, 'primary', 8.9 UNION ALL
SELECT 'INT036', 'CPD015', 'TGT016', 0.29, 0.41, 'primary', 8.5 UNION ALL
SELECT 'INT037', 'CPD015', 'TGT013', 0.95, 1.35, 'off-target', 7.2;
4. Créer une table pathways
Contient des voies biologiques, des zones de maladies associées et la pertinence du cancer.
CREATE OR REPLACE TABLE drug_target_graph.pathways AS
SELECT 'PWY001' AS pathway_id, 'MAPK Signaling' AS pathway_name, 'hsa04010' AS kegg_id, 'Cell Proliferation' AS biological_process, 'Oncology' AS disease_area, 'high' AS cancer_relevance UNION ALL
SELECT 'PWY002', 'PI3K-AKT Signaling', 'hsa04151', 'Cell Survival', 'Oncology', 'high' UNION ALL
SELECT 'PWY003', 'VEGF Signaling', 'hsa04370', 'Angiogenesis', 'Oncology', 'high' UNION ALL
SELECT 'PWY004', 'ErbB Signaling', 'hsa04012', 'Cell Growth', 'Oncology', 'high' UNION ALL
SELECT 'PWY005', 'mTOR Signaling', 'hsa04150', 'Cell Growth', 'Oncology', 'medium' UNION ALL
SELECT 'PWY006', 'Cell Cycle', 'hsa04110', 'Cell Division', 'Oncology', 'high' UNION ALL
SELECT 'PWY007', 'Cardiac Muscle Contraction', 'hsa04260', 'Cardiac Function', 'Cardiovascular', 'low' UNION ALL
SELECT 'PWY008', 'hERG Cardiac Channel', 'hsa04022', 'Cardiac Repolarisation','Cardiovascular', 'low' UNION ALL
SELECT 'PWY009', 'AMPK Signaling', 'hsa04152', 'Energy Metabolism', 'Metabolic', 'low' UNION ALL
SELECT 'PWY010', 'ALK Signaling', 'hsa04915', 'Cell Proliferation', 'Oncology', 'high' UNION ALL
SELECT 'PWY011', 'RAS Signaling', 'hsa04014', 'Cell Proliferation', 'Oncology', 'high' UNION ALL
SELECT 'PWY012', 'HIV Replication', 'hsa05170', 'Viral Replication', 'Infectious Disease', 'low';
5. Créer une table target_pathways
Table de jonction reliant les cibles aux voies biologiques auxquelles elles participent.
CREATE OR REPLACE TABLE drug_target_graph.target_pathways AS
SELECT 'TP001' AS tp_id, 'TGT001' AS target_id, 'PWY001' AS pathway_id, 'activator' AS role, 0.95 AS importance_score UNION ALL
SELECT 'TP002', 'TGT001', 'PWY011', 'activator', 0.88 UNION ALL
SELECT 'TP003', 'TGT002', 'PWY004', 'activator', 0.98 UNION ALL
SELECT 'TP004', 'TGT002', 'PWY001', 'activator', 0.82 UNION ALL
SELECT 'TP005', 'TGT002', 'PWY002', 'activator', 0.75 UNION ALL
SELECT 'TP006', 'TGT003', 'PWY003', 'activator', 0.96 UNION ALL
SELECT 'TP007', 'TGT003', 'PWY001', 'activator', 0.71 UNION ALL
SELECT 'TP008', 'TGT004', 'PWY001', 'activator', 0.97 UNION ALL
SELECT 'TP009', 'TGT004', 'PWY011', 'activator', 0.89 UNION ALL
SELECT 'TP010', 'TGT005', 'PWY010', 'activator', 0.99 UNION ALL
SELECT 'TP011', 'TGT005', 'PWY001', 'activator', 0.78 UNION ALL
SELECT 'TP012', 'TGT006', 'PWY002', 'activator', 0.98 UNION ALL
SELECT 'TP013', 'TGT006', 'PWY005', 'activator', 0.85 UNION ALL
SELECT 'TP014', 'TGT007', 'PWY001', 'activator', 0.94 UNION ALL
SELECT 'TP015', 'TGT007', 'PWY011', 'activator', 0.88 UNION ALL
SELECT 'TP016', 'TGT008', 'PWY006', 'activator', 0.95 UNION ALL
SELECT 'TP017', 'TGT009', 'PWY006', 'activator', 0.93 UNION ALL
SELECT 'TP018', 'TGT010', 'PWY005', 'activator', 0.99 UNION ALL
SELECT 'TP019', 'TGT010', 'PWY002', 'activator', 0.91 UNION ALL
SELECT 'TP020', 'TGT011', 'PWY003', 'activator', 0.87 UNION ALL
SELECT 'TP021', 'TGT011', 'PWY001', 'activator', 0.72 UNION ALL
SELECT 'TP022', 'TGT012', 'PWY001', 'activator', 0.83 UNION ALL
SELECT 'TP023', 'TGT012', 'PWY011', 'activator', 0.79 UNION ALL
SELECT 'TP024', 'TGT013', 'PWY008', 'substrate', 0.99 UNION ALL
SELECT 'TP025', 'TGT013', 'PWY007', 'substrate', 0.95 UNION ALL
SELECT 'TP026', 'TGT014', 'PWY009', 'activator', 0.97 UNION ALL
SELECT 'TP027', 'TGT015', 'PWY001', 'activator', 0.91 UNION ALL
SELECT 'TP028', 'TGT015', 'PWY011', 'activator', 0.86 UNION ALL
SELECT 'TP029', 'TGT016', 'PWY001', 'activator', 0.84 UNION ALL
SELECT 'TP030', 'TGT016', 'PWY003', 'activator', 0.77 UNION ALL
SELECT 'TP031', 'TGT017', 'PWY001', 'activator', 0.88 UNION ALL
SELECT 'TP032', 'TGT017', 'PWY011', 'activator', 0.82 UNION ALL
SELECT 'TP033', 'TGT018', 'PWY002', 'activator', 0.96 UNION ALL
SELECT 'TP034', 'TGT018', 'PWY005', 'activator', 0.88 UNION ALL
SELECT 'TP035', 'TGT019', 'PWY001', 'activator', 0.97 UNION ALL
SELECT 'TP036', 'TGT019', 'PWY011', 'activator', 0.91 UNION ALL
SELECT 'TP037', 'TGT020', 'PWY012', 'substrate', 0.99;
4. Créer le graphique de propriétés
Maintenant que les tables ont été créées, vous pouvez créer le graphique de propriétés. Cela permet de lier des nœuds (composés, cibles, voies) à l'aide de tables de périphérie (Interactions et Target Pathways).
Exécutez l'instruction suivante dans l'éditeur SQL de BigQuery Studio :
CREATE OR REPLACE PROPERTY GRAPH drug_target_graph.drug_target_interaction_graph
NODE TABLES (
drug_target_graph.compounds
AS compound_node
KEY (compound_id)
LABEL Compound
PROPERTIES (compound_id, compound_name, mechanism_of_action, dev_stage, therapeutic_area, molecular_weight),
drug_target_graph.targets
AS target_node
KEY (target_id)
LABEL Target
PROPERTIES (target_id, target_name, gene_name, uniprot_id, target_class, is_oncogene),
drug_target_graph.pathways
AS pathway_node
KEY (pathway_id)
LABEL Pathway
PROPERTIES (pathway_id, pathway_name, kegg_id, biological_process, disease_area, cancer_relevance)
)
EDGE TABLES (
drug_target_graph.interactions
AS binds_to_edge
KEY (interaction_id)
SOURCE KEY (compound_id) REFERENCES compound_node (compound_id)
DESTINATION KEY (target_id) REFERENCES target_node (target_id)
LABEL BINDS_TO
PROPERTIES (interaction_id, affinity_nm, ic50_nm, interaction_type, pchembl_value),
drug_target_graph.target_pathways
AS participates_in_edge
KEY (tp_id)
SOURCE KEY (target_id) REFERENCES target_node (target_id)
DESTINATION KEY (pathway_id) REFERENCES pathway_node (pathway_id)
LABEL PARTICIPATES_IN
PROPERTIES (tp_id, role, importance_score)
);
Un graphique nommé drug_target_interaction_graph est alors créé dans votre ensemble de données.

5. Requête 1 : Profil de liaison cible complet par composé
Exécutons notre première requête de graphe. Il s'agit d'un parcours en un saut qui répond à la question suivante : Quels composés se lient à quelles cibles et quelle est leur affinité ?
Requête GQL
Exécutez la requête suivante dans l'éditeur SQL :
SELECT
compound_name,
dev_stage,
target_name,
gene_name,
target_class,
interaction_type,
ROUND(affinity_nm, 3) AS affinity_nm,
ROUND(ic50_nm, 3) AS ic50_nm,
pchembl_value
FROM GRAPH_TABLE(
drug_target_graph.drug_target_interaction_graph
MATCH (c:Compound)-[b:BINDS_TO]->(t:Target)
COLUMNS (
c.compound_name AS compound_name,
c.dev_stage AS dev_stage,
t.target_name AS target_name,
t.gene_name AS gene_name,
t.target_class AS target_class,
b.interaction_type AS interaction_type,
b.affinity_nm AS affinity_nm,
b.ic50_nm AS ic50_nm,
b.pchembl_value AS pchembl_value
)
)
ORDER BY compound_name, interaction_type, affinity_nm;
Voici ce que vous verrez dans les résultats :

6. Requête 2 : Détection des risques cardiaques
La question commerciale
Dans la découverte de médicaments, l'une des raisons les plus courantes pour lesquelles un composé prometteur échoue lors des essais cliniques est la cardiotoxicité, plus précisément la liaison involontaire à la protéine hERG (gène : KCNH2), un canal ionique potassique qui régule le rythme cardiaque. Un effet hors cible sur hERG peut provoquer des arythmies mortelles et a été à l'origine de plusieurs retraits de médicaments très médiatisés.
La question à laquelle nous voulons répondre est la suivante :
"Quels composés de notre pipeline présentent un événement de liaison hors cible sur la protéine hERG, et quelles voies cardiaques cela met-il en danger ?"
Il s'agit d'une question à deux sauts : nous devons passer d'un composé à une voie en passant par une cible (hERG), ce qui permet de relier trois types d'entités à travers deux relations dans une seule requête.
Écrire la requête GQL
Exécutez la requête suivante dans l'éditeur SQL de BQ :
SELECT
compound_name,
dev_stage,
therapeutic_area,
target_name,
ROUND(affinity_nm, 3) AS herg_affinity_nm,
pathway_name,
disease_area AS pathway_disease_area
FROM GRAPH_TABLE(
drug_target_graph.drug_target_interaction_graph
MATCH (c:Compound)-[b:BINDS_TO]->(t:Target)-[p:PARTICIPATES_IN]->(pw:Pathway)
WHERE t.gene_name = 'KCNH2'
AND b.interaction_type = 'off-target'
AND pw.disease_area = 'Cardiovascular'
COLUMNS (
c.compound_name AS compound_name,
c.dev_stage AS dev_stage,
c.therapeutic_area AS therapeutic_area,
t.target_name AS target_name,
b.affinity_nm AS affinity_nm,
pw.pathway_name AS pathway_name,
pw.disease_area AS disease_area
)
)
ORDER BY herg_affinity_nm;
Notez que la clause MATCH se lit presque comme une phrase : "Trouver un composé qui se lie à une cible qui participe à une voie", avec les filtres appliqués à chaque nœud et arête le long du chemin.
Voici les données que vous verrez dans les résultats :

Visualiser le réseau de risques sous forme de graphique
Un tableau nous montre les données, mais pas la structure du risque. Plusieurs composés convergent-ils vers la même voie ? Y a-t-il un ou plusieurs composés à haut risque ?
Une visualisation graphique permet de le voir immédiatement. Exécutez la cellule ci-dessous pour afficher le même parcours à deux sauts sous la forme d'un réseau interactif :
GRAPH `drug_target_graph.drug_target_interaction_graph`
MATCH pt = (c:Compound)-[b:BINDS_TO]->(t:Target)-[p:PARTICIPATES_IN]->(pw:Pathway)
WHERE t.gene_name = 'KCNH2'
AND pw.disease_area = 'Cardiovascular'
RETURN
TO_JSON(pt) AS path
Un graphique semblable à celui-ci devrait s'afficher :

Chaque chemin du graphique trace une chaîne de responsabilité complète : un composé (nœuds bleus) se lie à la protéine hERG au centre, qui se connecte à une ou plusieurs voies cardiaques (nœuds verts). Ce qui n'était qu'une liste de lignes dans un tableau est désormais un réseau de risques visible. Les composés présentant plusieurs expositions à des voies de signalisation se distinguent immédiatement comme étant plus prioritaires pour l'examen de sécurité.
Consultez Why GQL Is More Elegant Than SQL (Pourquoi GQL est plus élégant que SQL).
Pour exécuter la même requête à deux sauts en SQL standard, vous avez besoin de quatre jointures explicites. Vous consacrez des efforts cognitifs à décrire comment joindre des tables plutôt que quelle relation vous recherchez. GQL vous permet de rester concentré sur la question.
SELECT
c.compound_name,
c.dev_stage,
c.therapeutic_area,
t.target_name,
ROUND(i.affinity_nm, 3) AS herg_affinity_nm,
pw.pathway_name,
pw.disease_area AS pathway_disease_area
FROM drug_target_graph.compounds c
JOIN drug_target_graph.interactions i ON c.compound_id = i.compound_id
JOIN drug_target_graph.targets t ON i.target_id = t.target_id
JOIN drug_target_graph.target_pathways tp ON t.target_id = tp.target_id
JOIN drug_target_graph.pathways pw ON tp.pathway_id = pw.pathway_id
WHERE t.gene_name = 'KCNH2'
AND i.interaction_type = 'off-target'
AND pw.disease_area = 'Cardiovascular'
ORDER BY herg_affinity_nm;
Aller plus loin : détection des risques liés aux métabolites multi-sauts
La requête ci-dessus identifie les composés qui se lient directement à la protéine hERG. Mais dans les workflows réels de sécurité des médicaments, le risque est parfois indirect : un composé peut être converti métaboliquement dans le corps en une molécule secondaire (un métabolite) qui se lie ensuite à hERG, un risque que les tests de liaison directe peuvent complètement ignorer.
Si votre graphique de propriétés incluait une table de nœuds Metabolite et un segment METABOLISES_INTO, vous pourriez étendre le même modèle MATCH à un parcours en trois sauts :
(Compound)-[METABOLISES_INTO]->(Metabolite)-[BINDS_TO]->
(Target)-[PARTICIPATES_IN]->(Pathway)
La structure de la requête GQL changerait d'exactement un nœud et une arête. Le code SQL équivalent nécessiterait deux JOIN supplémentaires. C'est ce modèle qui rend le parcours de graphe particulièrement puissant pour l'analyse des cascades de sécurité : la complexité de la requête augmente de manière linéaire, tandis que les insights biologiques augmentent de manière exponentielle.
7. Requête 3 : Paires de composés à cible partagée
Pour trouver des candidats à une thérapie combinée, nous pouvons identifier quand deux composés différents se lient au même nœud cible. Nous utilisons une correspondance bidirectionnelle pour répondre à la question suivante : Quels composés oncologiques convergent vers la même cible ?
Exécutez la requête suivante dans l'éditeur SQL :
SELECT
compound_a,
compound_b,
shared_target,
gene_name,
ROUND(affinity_a_nm, 3) AS affinity_a_nm,
ROUND(affinity_b_nm, 3) AS affinity_b_nm
FROM GRAPH_TABLE(
drug_target_graph.drug_target_interaction_graph
MATCH (c1:Compound)-[b1:BINDS_TO]->(t:Target)<-[b2:BINDS_TO]-(c2:Compound)
WHERE c1.compound_id < c2.compound_id
AND c1.therapeutic_area = 'Oncology'
AND c2.therapeutic_area = 'Oncology'
COLUMNS (
c1.compound_name AS compound_a,
c2.compound_name AS compound_b,
t.target_name AS shared_target,
t.gene_name AS gene_name,
b1.affinity_nm AS affinity_a_nm,
b2.affinity_nm AS affinity_b_nm
)
)
ORDER BY compound_a, compound_b, affinity_a_nm;
Voici les données que vous verrez dans les résultats :

Visualisation sous forme de graphique
Vous pouvez visualiser le graphique directement dans BigQuery en exécutant le code suivant dans l'éditeur SQL.
GRAPH `drug_target_graph.drug_target_interaction_graph`
MATCH p = (c1:Compound)-[b1:BINDS_TO]->(t:Target)<-[b2:BINDS_TO]-(c2:Compound)
WHERE c1.compound_id < c2.compound_id
AND c1.therapeutic_area = 'Oncology'
RETURN
TO_JSON(p) AS path
Ce parcours bidirectionnel met en évidence les paires de composés qui convergent vers la même cible protéique, un schéma difficile à repérer dans un tableau d'interactions plat, mais immédiatement visible sous forme de graphique. Dans la découverte de médicaments, les paires de cibles partagées sont le point de départ de la conception de thérapies combinées : deux composés touchant le même nœud dans une voie cancéreuse peuvent produire un effet synergique ou, au contraire, signaler une redondance involontaire dans le pipeline.

8. Requête 4 : Potentiel néfaste de la voie de la maladie
Quelle est l'ampleur de l'impact biologique de chaque composé ? Effectuons un parcours en deux sauts avec agrégation pour répondre à la question suivante : Combien de voies biologiques et de cibles distinctes chaque composé affecte-t-il, regroupés par domaine de maladie ?
Exécutez la requête suivante dans l'éditeur SQL :
SELECT
compound_name,
dev_stage,
disease_area,
COUNT(DISTINCT pathway_id) AS pathways_affected,
COUNT(DISTINCT target_id) AS targets_involved,
STRING_AGG(DISTINCT pathway_name ORDER BY pathway_name) AS pathway_list
FROM GRAPH_TABLE(
drug_target_graph.drug_target_interaction_graph
MATCH (c:Compound)-[b:BINDS_TO]->(t:Target)-[p:PARTICIPATES_IN]->(pw:Pathway)
COLUMNS (
c.compound_name AS compound_name,
c.dev_stage AS dev_stage,
t.target_id AS target_id,
pw.pathway_id AS pathway_id,
pw.pathway_name AS pathway_name,
pw.disease_area AS disease_area
)
)
GROUP BY compound_name, dev_stage, disease_area
ORDER BY compound_name, pathways_affected DESC;
Voici ce que vous verrez dans les résultats :

9. Requête 5 : Sélection de composés sûrs
Enfin, recherchons des composés qui ont une couverture oncologique élevée, mais qui évitent explicitement les effets hors cible hERG (cardiaques). Cela correspond aux modèles de sélection courants axés sur la sécurité dans les pipelines de découverte de médicaments.
Exécutez la requête suivante dans l'éditeur SQL :
WITH oncology_compounds AS (
SELECT DISTINCT compound_id, compound_name, dev_stage
FROM GRAPH_TABLE(
drug_target_graph.drug_target_interaction_graph
MATCH (c:Compound)-[b:BINDS_TO]->(t:Target)-[p:PARTICIPATES_IN]->(pw:Pathway)
WHERE pw.disease_area = 'Oncology'
AND pw.cancer_relevance = 'high'
COLUMNS (
c.compound_id AS compound_id,
c.compound_name AS compound_name,
c.dev_stage AS dev_stage
)
)
),
herg_risk_compounds AS (
SELECT DISTINCT compound_id
FROM GRAPH_TABLE(
drug_target_graph.drug_target_interaction_graph
MATCH (c:Compound)-[b:BINDS_TO]->(t:Target)
WHERE t.gene_name = 'KCNH2'
COLUMNS (c.compound_id AS compound_id)
)
)
SELECT
o.compound_name,
o.dev_stage,
'Clean cardiac profile' AS cardiac_safety
FROM oncology_compounds o
LEFT JOIN herg_risk_compounds h ON o.compound_id = h.compound_id
WHERE h.compound_id IS NULL
ORDER BY o.dev_stage, o.compound_name;
Voici le résultat que vous obtiendrez :

Vous avez réussi à exécuter des parcours de graphes avancés dans BigQuery pour extraire des profils clés de sécurité et d'efficacité.
10. Section bonus : Discuter avec votre graphique
L'analyse conversationnelle BigQuery est désormais compatible avec les graphes en tant que source de connaissances. Vous pouvez ainsi discuter en langage naturel avec le graphique que vous venez de créer.
Premiers pas : Ajouter un graphique en tant que source de connaissances
Pour commencer, créez un agent conversationnel en suivant ces étapes. Sélectionnez le graphique que vous avez créé dans la barre de recherche.

Utiliser l'analyse conversationnelle BigQuery pour discuter avec votre graphique
Une fois que vous avez ajouté la source de connaissances en tant que graphe, terminez la configuration de l'agent Conversational Analytics.
Vous pouvez ensuite commencer à discuter avec votre graphique en langage naturel.

Questions supplémentaires
- Quelles sont toutes les cibles des composés actuellement en phase 2 d'essais ?
- Quelles cibles sont partagées entre les composés cardiovasculaires et oncologiques ?
11. Effectuer un nettoyage
Pour éviter que des frais ne soient facturés sur votre compte Google Cloud, supprimez les ressources créées lors de cet atelier de programmation.
Exécutez la requête suivante pour supprimer le schéma et toutes les tables en cascade :
DROP SCHEMA IF EXISTS drug_target_graph CASCADE;
12. Félicitations
Félicitations ! Vous avez modélisé et analysé un réseau d'interactions médicament-cible à l'aide de BigQuery Graph.
Connaissances acquises
- Modéliser les relations entre des entités (composés, cibles, voies) sous forme de graphe de propriétés
- Définir le schéma et créer un graphe de propriétés dans BigQuery.
- Comment écrire des parcours de graphes complexes à l'aide de GQL et les comparer au SQL traditionnel.
- Comment exploiter
GRAPH_TABLE,MATCHet la correspondance bidirectionnelle pour résoudre les problèmes du domaine des sciences de la vie.