# Unid3

> UniD3 - Drug Discovery Knowledge Graph

- Skill: `gabrielmoreira/unid3` (Agent Skill, multi-file: 6 files)
- Install (CLI): `npx skillmds@latest add gabrielmoreira/unid3`
- Raw SKILL.md: https://api.skillmd.com/api/skills/gabrielmoreira/unid3/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Product & Planning
- Author: gabrielmoreira (https://skillmd.com/u/gabrielmoreira)
- Updated: 2026-09-21
- Page: https://skillmd.com/skills/gabrielmoreira/unid3

---

# 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.

```python
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).

```python
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.

```python
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.

```python
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.

```python
from UniD3 import search_by_keyword
search_by_keyword("inflammation")
search_by_keyword("cancer", limit=20)
```

## Typical Workflow

```python
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"]
```

