Part 2: Knowledge Graphs 101¶
Back to the drug interaction problem. You've decided to build a knowledge graph instead of just embedding documents.
You start with aspirin. What do you know about it?
- Aspirin is a drug
- Aspirin is an NSAID
- Aspirin is an anticoagulant
- Aspirin treats pain
- Aspirin treats inflammation
- Aspirin increases bleeding risk
Each of these is a relationship between aspirin and some other concept. Let's write them as triples:
(Aspirin) --IS_A--> (NSAID)
(Aspirin) --IS_A--> (Anticoagulant)
(Aspirin) --TREATS--> (Pain)
(Aspirin) --TREATS--> (Inflammation)
(Aspirin) --INCREASES_RISK--> (Bleeding)
Now warfarin:
(Warfarin) --IS_A--> (Anticoagulant)
(Warfarin) --TREATS--> (Blood Clots)
(Warfarin) --INCREASES_RISK--> (Bleeding)
Look at that. Aspirin and warfarin both connect to "Anticoagulant" and both connect to "Bleeding." The dangerous interaction is visible in the structure.
Concepts and edges¶
A concept (node) is a thing: a drug, a condition, a property, a procedure.
An edge connects two concepts with a semantic relationship.
The relationship type matters. "Aspirin TREATS Pain" is different from "Aspirin CAUSES Pain." The verb carries meaning.
Semantic types¶
qortex uses 10 relationship types:
| Type | Meaning | Example |
|---|---|---|
| REQUIRES | A needs B | Circuit Breaker REQUIRES Timeout |
| CONTRADICTS | A and B conflict | Retry CONTRADICTS Fail-Fast |
| REFINES | A is a specific form of B | Ibuprofen REFINES NSAID |
| IMPLEMENTS | A is a concrete form of B | Redis IMPLEMENTS Cache |
| PART_OF | A is a component of B | Handler PART_OF Middleware |
| USES | A depends on B | Service USES Database |
| SIMILAR_TO | A and B are analogous | Aspirin SIMILAR_TO Ibuprofen |
| ALTERNATIVE_TO | A can substitute for B | Tylenol ALTERNATIVE_TO Aspirin |
| SUPPORTS | A provides evidence for B | Study SUPPORTS Efficacy |
| CHALLENGES | A provides counter-evidence | Side Effect CHALLENGES Safety |
Rich typing is what enables automated rule derivation later. If you know the relationship type, you can generate rules mechanically.
Domains¶
Concepts belong to domains, isolated subgraphs like schemas in a database.
You might have: - A "pharmacology" domain with drug concepts - An "error_handling" domain with software patterns - A "legal" domain with compliance rules
Domains don't interact by default. This prevents cross-contamination when you ingest multiple sources.
Your first knowledge graph¶
from qortex.core.models import ConceptNode, ConceptEdge, RelationType
from qortex.core.memory import InMemoryBackend
backend = InMemoryBackend()
backend.connect()
backend.create_domain("pharmacology", "Drug interactions and effects")
# Add concepts
backend.add_node(ConceptNode(
id="aspirin",
name="Aspirin",
description="NSAID with anticoagulant properties",
domain="pharmacology",
source_id="drug_database",
))
backend.add_node(ConceptNode(
id="anticoagulant",
name="Anticoagulant",
description="Substance that prevents blood clotting",
domain="pharmacology",
source_id="drug_database",
))
# Add relationship
backend.add_edge(ConceptEdge(
source_id="aspirin",
target_id="anticoagulant",
relation_type=RelationType.REFINES, # Aspirin is a type of anticoagulant
))
You now have structure. Concepts connected by typed relationships.
But a graph sitting in memory doesn't help anyone. You need to extract actionable rules from it.
What you learned¶
- Knowledge graphs store concepts (nodes) and relationships (edges)
- Edge types carry semantic meaning (REQUIRES vs CONTRADICTS)
- 10 relationship types enable automated rule derivation
- Domains isolate subgraphs to prevent cross-contamination
Next¶
Part 3: The Projection Pipeline: How do you turn a graph into actionable rules?