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
required
Array of starting concept IDs for traversal (1-50 concepts)
object
Optional parameters for controlling the traversal
Show traversal_params
Show traversal_params
integer
default:"3"
Maximum traversal depth (1-5)
array
Array of relationship types to follow (default: [“Is a”, “Subsumes”, “Mapped from”])
array
Limit traversal to specific vocabularies
boolean
default:"true"
Include invalid/deprecated concepts in traversal
boolean
default:"false"
Include detailed path information in response
boolean
default:"false"
Use breadth-first traversal (default is depth-first)
number
Minimum relevance score filter (0.0-1.0)
integer
default:"100"
Maximum number of results to return
Query Parameters
string
Specific vocabulary release version (e.g., “2025.1”)
Response
boolean
required
Indicates whether the request was successful
object
required
Response data containing traversal results
Show data
Show data
array
Array of concept IDs that were used as starting points
array
array
object
required
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?