UniD3 - Drug Discovery Knowledge Graph
Overview
UniD3 is a multi-knowledge-graph built from 150,000+ PubMed articles, stored as 6 GraphML files. It supports drug-disease matching, effectiveness assessment, and drug-target analysis.
- Source: https://github.com/QSong-github/UniD3
- Local path:
resources_metadata/drug_knowledgebase/UniD3 - Format: GraphML (6 files, e.g.
UniD3_L1T1.graphml) - Dependency:
networkx
Node Schema
Each node contains:
| Field | Description |
|---|---|
entity |
Node name (e.g. RESPIRATORY DISEASES) |
entity_type |
Type label (e.g. DISEASE, DRUG, GENE, HOST, BIOLOGICAL PROCESS) |
description |
Free-text description from PubMed articles |
source_id |
Chunk ID linking back to source article |
Edge Schema
Each edge contains:
| Field | Description |
|---|---|
source / target |
Connected entity names |
weight |
Relation strength (float) |
description |
Relationship description |
keywords |
Associated keywords |
source_id |
Source chunk ID |
API Reference
list_graphs() → list[str]
Return names of all 6 GraphML files.
from UniD3 import list_graphs
list_graphs()
# → ["UniD3_L1T1", "UniD3_L1T2", "UniD3_L2T1", ...]
query_entities(entities, graph_names=None) → list[dict]
Look up one or more entities by name (case-insensitive).
from UniD3 import query_entities
# Single entity
query_entities("RESPIRATORY DISEASES")
# Multiple entities
query_entities(["CALVES", "INFLAMMATION MODULATION"])
# Restrict to specific graph
query_entities("CALVES", graph_names=["UniD3_L1T1"])
Returns list of dicts: {entity, entity_type, description, source_id, graph}
get_neighbors(entity, graph_names=None) → list[dict]
Get all direct neighbors and connecting edge info for an entity.
from UniD3 import get_neighbors
get_neighbors("CALVES")
Returns list of dicts: {graph, neighbor: {entity, entity_type, description, source_id}, edge: {source, target, weight, description, keywords, source_id}}
search_by_type(entity_type, graph_names=None, limit=50) → list[dict]
Filter entities by type.
from UniD3 import search_by_type
search_by_type("DISEASE", limit=10)
search_by_type("DRUG", graph_names=["UniD3_L1T1"])
search_by_keyword(keyword, graph_names=None, limit=50) → list[dict]
Substring match over entity names and descriptions.
from UniD3 import search_by_keyword
search_by_keyword("inflammation")
search_by_keyword("cancer", limit=20)
Typical Workflow
from UniD3 import query_entities, get_neighbors, search_by_type
# Step 1: Find a drug entity
hits = query_entities("ASPIRIN")
# Step 2: Explore its neighborhood (related diseases, targets, etc.)
neighbors = get_neighbors("ASPIRIN")
# Step 3: Filter neighbors by type
diseases = [n for n in neighbors if n["neighbor"]["entity_type"] == "DISEASE"]