curl -X POST "https://api.omophub.com/v1/concepts/relationships/traverse" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"concept_ids": [201826],
"traversal_params": {
"relationship_types": ["Is a", "Maps to"],
"max_depth": 3
}
}'
import requests
def traverse_relationships(concept_ids, traversal_params=None):
url = "https://api.omophub.com/v1/concepts/relationships/traverse"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
data = {"concept_ids": concept_ids}
if traversal_params:
data["traversal_params"] = traversal_params
response = requests.post(url, json=data, headers=headers)
return response.json()
# Example: Traverse from Type 2 diabetes
result = traverse_relationships(
concept_ids=[201826],
traversal_params={
"relationship_types": ["Is a", "Subsumes", "Maps to"],
"max_depth": 3,
"include_paths": True
}
)
data = result['data']
print(f"Starting concepts: {data['starting_concepts']}")
print(f"Discovered {data['traversal_summary']['total_discovered']} concepts")
print(f"Max distance: {data['traversal_summary']['max_distance_reached']}")
for concept in data['discovered_concepts'][:5]:
print(f" - {concept['concept_name']} (distance: {concept['distance']})")
import { OMOPHub } from '@omophub/omophub-node';
// Not yet exposed as a dedicated SDK method — use the typed low-level helper.
const client = new OMOPHub();
interface TraversalResult {
starting_concepts: number[];
traversal_summary: { total_discovered: number; max_distance_reached: number };
discovered_concepts: Array<{ concept_name: string; distance: number }>;
}
const { data } = await client.post<TraversalResult>('/concepts/relationships/traverse', {
concept_ids: [201826],
traversal_params: { relationship_types: ['Is a', 'Maps to'], max_depth: 3 },
});
console.log(`Discovered ${data?.traversal_summary.total_discovered} concepts`);
data?.discovered_concepts.slice(0, 5).forEach(concept => {
console.log(`- ${concept.concept_name} (distance: ${concept.distance})`);
});
{
"success": true,
"data": {
"starting_concepts": [201826],
"discovered_concepts": [
{
"concept_id": 73211009,
"concept_name": "Diabetes mellitus",
"vocabulary_id": "SNOMED",
"distance": 1,
"path": ["Type 2 diabetes mellitus", "Diabetes mellitus"],
"relationship_path": ["Is a"]
},
{
"concept_id": 443767,
"concept_name": "Type 2 diabetes mellitus with complications",
"vocabulary_id": "SNOMED",
"distance": 1,
"path": ["Type 2 diabetes mellitus", "Type 2 diabetes mellitus with complications"],
"relationship_path": ["Subsumes"]
},
{
"concept_id": 435216,
"concept_name": "Type 2 diabetes mellitus",
"vocabulary_id": "ICD10CM",
"distance": 1,
"path": ["Type 2 diabetes mellitus", "Type 2 diabetes mellitus"],
"relationship_path": ["Maps to"]
}
],
"relationship_paths": [],
"traversal_summary": {
"total_discovered": 25,
"max_distance_reached": 3,
"relationship_types_used": ["Is a", "Subsumes", "Maps to"]
}
},
"meta": {
"request_id": "req_traverse_123",
"timestamp": "2025-01-15T10:00:00Z",
"vocab_release": "2025.1"
}
}
Traverse Relationships
Traverse OMOP relationship networks across vocabularies to discover connected concepts - RxNorm ingredients, SNOMED parents, ICD mappings, and more.
curl -X POST "https://api.omophub.com/v1/concepts/relationships/traverse" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"concept_ids": [201826],
"traversal_params": {
"relationship_types": ["Is a", "Maps to"],
"max_depth": 3
}
}'
import requests
def traverse_relationships(concept_ids, traversal_params=None):
url = "https://api.omophub.com/v1/concepts/relationships/traverse"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
data = {"concept_ids": concept_ids}
if traversal_params:
data["traversal_params"] = traversal_params
response = requests.post(url, json=data, headers=headers)
return response.json()
# Example: Traverse from Type 2 diabetes
result = traverse_relationships(
concept_ids=[201826],
traversal_params={
"relationship_types": ["Is a", "Subsumes", "Maps to"],
"max_depth": 3,
"include_paths": True
}
)
data = result['data']
print(f"Starting concepts: {data['starting_concepts']}")
print(f"Discovered {data['traversal_summary']['total_discovered']} concepts")
print(f"Max distance: {data['traversal_summary']['max_distance_reached']}")
for concept in data['discovered_concepts'][:5]:
print(f" - {concept['concept_name']} (distance: {concept['distance']})")
import { OMOPHub } from '@omophub/omophub-node';
// Not yet exposed as a dedicated SDK method — use the typed low-level helper.
const client = new OMOPHub();
interface TraversalResult {
starting_concepts: number[];
traversal_summary: { total_discovered: number; max_distance_reached: number };
discovered_concepts: Array<{ concept_name: string; distance: number }>;
}
const { data } = await client.post<TraversalResult>('/concepts/relationships/traverse', {
concept_ids: [201826],
traversal_params: { relationship_types: ['Is a', 'Maps to'], max_depth: 3 },
});
console.log(`Discovered ${data?.traversal_summary.total_discovered} concepts`);
data?.discovered_concepts.slice(0, 5).forEach(concept => {
console.log(`- ${concept.concept_name} (distance: ${concept.distance})`);
});
{
"success": true,
"data": {
"starting_concepts": [201826],
"discovered_concepts": [
{
"concept_id": 73211009,
"concept_name": "Diabetes mellitus",
"vocabulary_id": "SNOMED",
"distance": 1,
"path": ["Type 2 diabetes mellitus", "Diabetes mellitus"],
"relationship_path": ["Is a"]
},
{
"concept_id": 443767,
"concept_name": "Type 2 diabetes mellitus with complications",
"vocabulary_id": "SNOMED",
"distance": 1,
"path": ["Type 2 diabetes mellitus", "Type 2 diabetes mellitus with complications"],
"relationship_path": ["Subsumes"]
},
{
"concept_id": 435216,
"concept_name": "Type 2 diabetes mellitus",
"vocabulary_id": "ICD10CM",
"distance": 1,
"path": ["Type 2 diabetes mellitus", "Type 2 diabetes mellitus"],
"relationship_path": ["Maps to"]
}
],
"relationship_paths": [],
"traversal_summary": {
"total_discovered": 25,
"max_distance_reached": 3,
"relationship_types_used": ["Is a", "Subsumes", "Maps to"]
}
},
"meta": {
"request_id": "req_traverse_123",
"timestamp": "2025-01-15T10:00:00Z",
"vocab_release": "2025.1"
}
}
Overview
This endpoint allows you to traverse relationship networks starting from one or more concepts, following chains of relationships to discover connected concepts. Uses a recursive graph traversal algorithm with cycle detection.Request Body
Array of starting concept IDs for traversal (1-50 concepts)
Optional parameters for controlling the traversal
Show traversal_params
Show traversal_params
Maximum traversal depth (1-5)
Array of relationship types to follow (default: [“Is a”, “Subsumes”, “Mapped from”])
Limit traversal to specific vocabularies
Include invalid/deprecated concepts in traversal
Include detailed path information in response
Use breadth-first traversal (default is depth-first)
Minimum relevance score filter (0.0-1.0)
Maximum number of results to return
Query Parameters
Specific vocabulary release version (e.g., “2025.1”)
Response
Indicates whether the request was successful
Response data containing traversal results
Show data
Show data
Array of concept IDs that were used as starting points
Array of concepts discovered during traversal
curl -X POST "https://api.omophub.com/v1/concepts/relationships/traverse" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"concept_ids": [201826],
"traversal_params": {
"relationship_types": ["Is a", "Maps to"],
"max_depth": 3
}
}'
import requests
def traverse_relationships(concept_ids, traversal_params=None):
url = "https://api.omophub.com/v1/concepts/relationships/traverse"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
data = {"concept_ids": concept_ids}
if traversal_params:
data["traversal_params"] = traversal_params
response = requests.post(url, json=data, headers=headers)
return response.json()
# Example: Traverse from Type 2 diabetes
result = traverse_relationships(
concept_ids=[201826],
traversal_params={
"relationship_types": ["Is a", "Subsumes", "Maps to"],
"max_depth": 3,
"include_paths": True
}
)
data = result['data']
print(f"Starting concepts: {data['starting_concepts']}")
print(f"Discovered {data['traversal_summary']['total_discovered']} concepts")
print(f"Max distance: {data['traversal_summary']['max_distance_reached']}")
for concept in data['discovered_concepts'][:5]:
print(f" - {concept['concept_name']} (distance: {concept['distance']})")
import { OMOPHub } from '@omophub/omophub-node';
// Not yet exposed as a dedicated SDK method — use the typed low-level helper.
const client = new OMOPHub();
interface TraversalResult {
starting_concepts: number[];
traversal_summary: { total_discovered: number; max_distance_reached: number };
discovered_concepts: Array<{ concept_name: string; distance: number }>;
}
const { data } = await client.post<TraversalResult>('/concepts/relationships/traverse', {
concept_ids: [201826],
traversal_params: { relationship_types: ['Is a', 'Maps to'], max_depth: 3 },
});
console.log(`Discovered ${data?.traversal_summary.total_discovered} concepts`);
data?.discovered_concepts.slice(0, 5).forEach(concept => {
console.log(`- ${concept.concept_name} (distance: ${concept.distance})`);
});
{
"success": true,
"data": {
"starting_concepts": [201826],
"discovered_concepts": [
{
"concept_id": 73211009,
"concept_name": "Diabetes mellitus",
"vocabulary_id": "SNOMED",
"distance": 1,
"path": ["Type 2 diabetes mellitus", "Diabetes mellitus"],
"relationship_path": ["Is a"]
},
{
"concept_id": 443767,
"concept_name": "Type 2 diabetes mellitus with complications",
"vocabulary_id": "SNOMED",
"distance": 1,
"path": ["Type 2 diabetes mellitus", "Type 2 diabetes mellitus with complications"],
"relationship_path": ["Subsumes"]
},
{
"concept_id": 435216,
"concept_name": "Type 2 diabetes mellitus",
"vocabulary_id": "ICD10CM",
"distance": 1,
"path": ["Type 2 diabetes mellitus", "Type 2 diabetes mellitus"],
"relationship_path": ["Maps to"]
}
],
"relationship_paths": [],
"traversal_summary": {
"total_discovered": 25,
"max_distance_reached": 3,
"relationship_types_used": ["Is a", "Subsumes", "Maps to"]
}
},
"meta": {
"request_id": "req_traverse_123",
"timestamp": "2025-01-15T10:00:00Z",
"vocab_release": "2025.1"
}
}
Usage Examples
Basic Traversal
Simple traversal with default settings:{
"concept_ids": [201826],
"traversal_params": {
"max_depth": 2
}
}
With Path Details
Include detailed path information:{
"concept_ids": [201826],
"traversal_params": {
"relationship_types": ["Is a", "Maps to"],
"max_depth": 3,
"include_paths": true
}
}
Multiple Starting Concepts
Traverse from multiple concepts:{
"concept_ids": [201826, 4182210, 313217],
"traversal_params": {
"max_depth": 2,
"page_size": 50
}
}
Vocabulary-Filtered Traversal
Limit to specific vocabularies:{
"concept_ids": [201826],
"traversal_params": {
"vocabulary_ids": ["SNOMED", "ICD10CM"],
"max_depth": 3
}
}
Important Notes
- Concept limit: Maximum 50 starting concepts per request
- Depth limit: Maximum traversal depth is 5 to prevent performance issues
- Cycle detection: The algorithm prevents infinite loops by tracking visited concepts
- Performance: Deep traversals with many starting concepts may take longer
- Default relationships: If not specified, uses [“Is a”, “Subsumes”, “Mapped from”]
Related Endpoints
- Batch Hierarchy Queries - Batch hierarchy queries
- Get Concept Relationships - Single concept relationships
- Get Concept Hierarchy - Hierarchical relationships only
Was this page helpful?
⌘I