1
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Knowledge Graphs
2
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
3
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
PlanOpticon builds structured knowledge graphs from video analyses, document ingestion, and other content sources. A knowledge graph captures **entities** (people, technologies, concepts, organizations) and the **relationships** between them, providing a queryable representation of everything discussed or presented in your source material.
4
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
5
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
6
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
7
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Storage
8
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
9
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Knowledge graphs are stored as SQLite databases (`knowledge_graph.db`) using Python's built-in `sqlite3` module. This means:
10
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
11
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- **Zero external dependencies.** No database server to install or manage.
12
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- **Single-file portability.** Copy the `.db` file to share a knowledge graph.
13
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- **WAL mode.** SQLite Write-Ahead Logging is enabled for concurrent read performance.
14
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- **JSON fallback.** Knowledge graphs can also be saved as `knowledge_graph.json` for interoperability, though SQLite is preferred for performance and querying.
15
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
16
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Database Schema
17
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
18
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The SQLite store uses the following tables:
19
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
20
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Table | Purpose |
21
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|---|---|
22
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `entities` | Core entity records with name, type, descriptions, source, and arbitrary properties |
23
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `occurrences` | Where and when each entity was mentioned (source, timestamp, text snippet) |
24
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `relationships` | Directed edges between entities with type, content source, timestamp, and properties |
25
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `sources` | Registered content sources with provenance metadata (source type, title, path, URL, MIME type, ingestion timestamp) |
26
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `source_locations` | Links between sources and specific entities/relationships, with location details (timestamp, page, section, line range, text snippet) |
27
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
28
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
All entity lookups are case-insensitive (indexed on `name_lower`). Entities and relationships are indexed on their source and target fields for efficient traversal.
29
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
30
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Storage Backends
31
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
32
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
PlanOpticon supports two storage backends, selected automatically:
33
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
34
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Backend | When Used | Persistence |
35
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|---|---|---|
36
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `SQLiteStore` | When a `db_path` is provided | Persistent on disk |
37
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `InMemoryStore` | When no path is given, or as fallback | In-memory only |
38
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
39
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Both backends implement the same `GraphStore` abstract interface, so all query and manipulation code works identically regardless of backend.
40
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
41
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
42
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
from video_processor.integrators.graph_store import create_store
43
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
44
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Persistent SQLite store
45
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
store = create_store("/path/to/knowledge_graph.db")
46
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
47
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# In-memory store (for temporary operations)
48
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
store = create_store()
49
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
50
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
51
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
52
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
53
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Entity Types
54
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
55
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Entities extracted from content are assigned one of the following base types:
56
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
57
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Type | Description | Specificity Rank |
58
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|---|---|---|
59
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `person` | People mentioned or participating | 3 (highest) |
60
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `technology` | Tools, languages, frameworks, platforms | 3 |
61
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `organization` | Companies, teams, departments | 2 |
62
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `time` | Dates, deadlines, time references | 1 |
63
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `diagram` | Visual diagrams extracted from video frames | 1 |
64
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `concept` | General concepts, topics, ideas (default) | 0 (lowest) |
65
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
66
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The specificity rank is used during merge operations: when two entities are matched as duplicates, the more specific type wins (e.g., `technology` overrides `concept`).
67
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
68
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Planning Taxonomy
69
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
70
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Beyond the base entity types, PlanOpticon includes a planning taxonomy for classifying entities into project-planning categories. The `TaxonomyClassifier` maps extracted entities into these types:
71
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
72
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Planning Type | Keywords Matched |
73
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|---|---|
74
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `goal` | goal, objective, aim, target outcome |
75
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `requirement` | must, should, requirement, need, required |
76
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `constraint` | constraint, limitation, restrict, cannot, must not |
77
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `decision` | decided, decision, chose, selected, agreed |
78
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `risk` | risk, concern, worry, danger, threat |
79
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `assumption` | assume, assumption, expecting, presume |
80
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `dependency` | depends, dependency, relies on, prerequisite, blocked |
81
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `milestone` | milestone, deadline, deliverable, release, launch |
82
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `task` | task, todo, action item, work item, implement |
83
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `feature` | feature, capability, functionality |
84
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
85
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Classification works in two stages:
86
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
87
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
1. **Heuristic classification.** Entity descriptions are scanned for the keywords listed above. First match wins.
88
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
2. **LLM refinement.** If an LLM provider is available, entities are sent to the LLM for more nuanced classification with priority assignment (`high`, `medium`, `low`). LLM results override heuristic results on conflicts.
89
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
90
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Classified entities are used by planning agent skills (project_plan, prd, roadmap, task_breakdown) to produce targeted, context-aware artifacts.
91
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
92
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
93
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
94
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Relationship Types
95
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
96
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Relationships are directed edges between entities. The `type` field is a free-text string determined by the LLM during extraction. Common relationship types include:
97
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
98
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `related_to` (default)
99
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `works_with`
100
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `uses`
101
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `depends_on`
102
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `proposed`
103
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `discussed_by`
104
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `employed_by`
105
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `collaborates_with`
106
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `expert_in`
107
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
108
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Typed Relationships
109
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
110
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The `add_typed_relationship()` method creates edges with custom labels and optional properties, enabling richer graph semantics:
111
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
112
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
113
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
store.add_typed_relationship(
114
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
source="Authentication Service",
115
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
target="PostgreSQL",
116
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
edge_label="USES_SYSTEM",
117
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
properties={"purpose": "user credential storage", "version": "15"},
118
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
)
119
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
120
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
121
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Relationship Checks
122
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
123
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
You can check whether a relationship exists between two entities:
124
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
125
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
126
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Check for any relationship
127
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
store.has_relationship("Alice", "Kubernetes")
128
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
129
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Check for a specific relationship type
130
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
store.has_relationship("Alice", "Kubernetes", edge_label="expert_in")
131
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
132
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
133
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
134
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
135
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Building a Knowledge Graph
136
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
137
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### From Video Analysis
138
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
139
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The primary path for building a knowledge graph is through video analysis. When you run `planopticon analyze`, the pipeline extracts entities and relationships from:
140
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
141
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- **Transcript segments** -- batched in groups of 10 for efficient API usage, with speaker identification
142
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- **Diagram content** -- text extracted from visual diagrams detected in video frames
143
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
144
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
145
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon analyze -i meeting.mp4 -o results/
146
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Creates results/knowledge_graph.db
147
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
148
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
149
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### From Document Ingestion
150
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
151
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Documents (Markdown, PDF, DOCX) can be ingested directly into a knowledge graph:
152
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
153
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
154
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Ingest a single file
155
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon ingest -i requirements.pdf -o results/
156
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
157
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Ingest a directory recursively
158
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon ingest -i docs/ -o results/ --recursive
159
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
160
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Ingest into an existing knowledge graph
161
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon ingest -i notes.md --db results/knowledge_graph.db
162
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
163
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
164
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### From Batch Processing
165
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
166
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Multiple videos can be processed in batch mode, with all results merged into a single knowledge graph:
167
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
168
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
169
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon batch -i videos/ -o results/
170
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
171
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
172
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Programmatic Construction
173
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
174
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
175
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
from video_processor.integrators.knowledge_graph import KnowledgeGraph
176
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
177
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Create a new knowledge graph with LLM extraction
178
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
from video_processor.providers.manager import ProviderManager
179
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
pm = ProviderManager()
180
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
kg = KnowledgeGraph(provider_manager=pm, db_path="knowledge_graph.db")
181
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
182
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Add content (entities and relationships are extracted by LLM)
183
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
kg.add_content(
184
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
text="Alice proposed using Kubernetes for container orchestration.",
185
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
source="meeting_notes",
186
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
timestamp=120.5,
187
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
)
188
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
189
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Process a full transcript
190
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
kg.process_transcript(transcript_data, batch_size=10)
191
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
192
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Process diagram results
193
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
kg.process_diagrams(diagram_results)
194
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
195
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Save
196
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
kg.save("knowledge_graph.db")
197
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
198
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
199
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
200
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
201
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Merge and Deduplication
202
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
203
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
When combining knowledge graphs from multiple sources, PlanOpticon performs intelligent merge with deduplication.
204
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
205
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Fuzzy Name Matching
206
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
207
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Entity names are compared using Python's `SequenceMatcher` with a threshold of 0.85. This means "Kubernetes" and "kubernetes" are matched exactly (case-insensitive), while "React.js" and "ReactJS" may be matched as duplicates if their similarity ratio meets the threshold.
208
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
209
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Type Conflict Resolution
210
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
211
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
When two entities match but have different types, the more specific type wins based on the specificity ranking:
212
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
213
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Scenario | Result |
214
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|---|---|
215
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `concept` vs `technology` | `technology` wins (rank 3 > rank 0) |
216
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `person` vs `concept` | `person` wins (rank 3 > rank 0) |
217
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `organization` vs `concept` | `organization` wins (rank 2 > rank 0) |
218
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `person` vs `technology` | Keeps whichever was first (equal rank) |
219
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
220
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Provenance Tracking
221
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
222
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Merged entities receive a `merged_from:<original_name>` description entry, preserving the audit trail of which entities were unified.
223
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
224
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Programmatic Merge
225
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
226
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
227
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
from video_processor.integrators.knowledge_graph import KnowledgeGraph
228
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
229
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Load two knowledge graphs
230
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
kg1 = KnowledgeGraph(db_path="project_a.db")
231
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
kg2 = KnowledgeGraph(db_path="project_b.db")
232
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
233
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Merge kg2 into kg1
234
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
kg1.merge(kg2)
235
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
236
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Save the merged result
237
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
kg1.save("merged.db")
238
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
239
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
240
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The merge operation also copies all registered sources and occurrences, so provenance information is preserved across merges.
241
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
242
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
243
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
244
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Querying
245
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
246
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
PlanOpticon provides two query modes: direct mode (no LLM required) and agentic mode (LLM-powered natural language).
247
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
248
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Direct Mode
249
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
250
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Direct mode queries are fast, deterministic, and require no API key. They are the right choice for structured lookups.
251
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
252
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
#### Stats
253
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
254
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Return entity count, relationship count, and entity type breakdown:
255
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
256
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
257
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon query
258
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
259
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
260
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
261
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
engine.stats()
262
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# QueryResult with data: {
263
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# "entity_count": 42,
264
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# "relationship_count": 87,
265
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# "entity_types": {"technology": 15, "person": 12, ...}
266
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# }
267
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
268
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
269
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
#### Entities
270
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
271
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Filter entities by name substring and/or type:
272
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
273
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
274
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon query "entities --type technology"
275
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon query "entities --name python"
276
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
277
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
278
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
279
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
engine.entities(entity_type="technology")
280
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
engine.entities(name="python")
281
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
engine.entities(name="auth", entity_type="concept", limit=10)
282
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
283
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
284
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
All filtering is case-insensitive. Results are capped at 50 by default (configurable via `limit`).
285
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
286
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
#### Neighbors
287
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
288
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Get an entity and all directly connected nodes and relationships:
289
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
290
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
291
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon query "neighbors Alice"
292
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
293
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
294
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
295
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
engine.neighbors("Alice", depth=1)
296
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
297
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
298
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The `depth` parameter controls how many hops to traverse (default 1). The result includes both entity objects and relationship objects.
299
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
300
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
#### Relationships
301
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
302
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Filter relationships by source, target, and/or type:
303
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
304
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
305
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon query "relationships --source Alice"
306
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
307
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
308
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
309
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
engine.relationships(source="Alice")
310
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
engine.relationships(target="Kubernetes", rel_type="uses")
311
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
312
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
313
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
#### Sources
314
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
315
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
List all registered content sources:
316
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
317
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
318
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
engine.sources()
319
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
320
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
321
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
#### Provenance
322
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
323
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Get all source locations for a specific entity, showing exactly where it was mentioned:
324
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
325
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
326
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
engine.provenance("Kubernetes")
327
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Returns source locations with timestamps, pages, sections, and text snippets
328
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
329
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
330
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
#### Raw SQL
331
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
332
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Execute arbitrary SQL against the SQLite backend (SQLite stores only):
333
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
334
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
335
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
engine.sql("SELECT name, type FROM entities WHERE type = 'technology' ORDER BY name")
336
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
337
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
338
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Agentic Mode
339
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
340
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Agentic mode accepts natural-language questions and uses the LLM to plan and execute queries. It requires a configured LLM provider.
341
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
342
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
343
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon query "What technologies were discussed?"
344
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon query "Who are the key people mentioned?"
345
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon query "What depends on the authentication service?"
346
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
347
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
348
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The agentic query pipeline:
349
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
350
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
1. **Plan.** The LLM receives graph stats and available actions (entities, relationships, neighbors, stats). It selects exactly one action and its parameters.
351
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
2. **Execute.** The chosen action is run through the direct-mode engine.
352
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
3. **Synthesize.** The LLM receives the raw query results and the original question, then produces a concise natural-language answer.
353
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
354
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
This design ensures the LLM never generates arbitrary code -- it only selects from a fixed set of known query actions.
355
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
356
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
357
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Requires an API key
358
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon query "What technologies were discussed?" -p openai
359
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
360
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Use the interactive REPL for multiple queries
361
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon query -I
362
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
363
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
364
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
365
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
366
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Graph Query Engine Python API
367
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
368
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The `GraphQueryEngine` class provides the programmatic interface for all query operations.
369
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
370
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Initialization
371
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
372
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
373
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
from video_processor.integrators.graph_query import GraphQueryEngine
374
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
from video_processor.integrators.graph_discovery import find_nearest_graph
375
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
376
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# From a .db file
377
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
path = find_nearest_graph()
378
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
engine = GraphQueryEngine.from_db_path(path)
379
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
380
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# From a .json file
381
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
engine = GraphQueryEngine.from_json_path("knowledge_graph.json")
382
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
383
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# With an LLM provider for agentic mode
384
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
from video_processor.providers.manager import ProviderManager
385
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
pm = ProviderManager()
386
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
engine = GraphQueryEngine.from_db_path(path, provider_manager=pm)
387
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
388
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
389
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### QueryResult
390
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
391
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
All query methods return a `QueryResult` dataclass with multiple output formats:
392
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
393
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
394
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
result = engine.stats()
395
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
396
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Human-readable text
397
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
print(result.to_text())
398
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
399
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# JSON string
400
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
print(result.to_json())
401
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
402
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Mermaid diagram (for graph results)
403
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
result = engine.neighbors("Alice")
404
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
print(result.to_mermaid())
405
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
406
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
407
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The `QueryResult` contains:
408
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
409
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Field | Type | Description |
410
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|---|---|---|
411
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `data` | Any | The raw result data (dict, list, or scalar) |
412
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `query_type` | str | `"filter"` for direct mode, `"agentic"` for LLM mode, `"sql"` for raw SQL |
413
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `raw_query` | str | String representation of the executed query |
414
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `explanation` | str | Human-readable explanation or LLM-synthesized answer |
415
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
416
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
417
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
418
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## The Self-Contained HTML Viewer
419
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
420
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
PlanOpticon includes a zero-dependency HTML knowledge graph viewer at `knowledge-base/viewer.html`. This file is fully self-contained -- it inlines D3.js and requires no build step, no server, and no internet connection.
421
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
422
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
To use it, open `viewer.html` in a browser. It will load and visualize a `knowledge_graph.json` file (place it in the same directory, or use the file picker in the viewer).
423
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
424
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The viewer provides:
425
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
426
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Interactive force-directed graph layout
427
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Zoom and pan navigation
428
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Entity nodes colored by type
429
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Relationship edges with labels
430
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Click-to-focus on individual entities
431
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Entity detail panel showing descriptions and connections
432
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
433
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
This covers approximately 80% of graph exploration needs with zero infrastructure.
434
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
435
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
436
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
437
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## KG Management Commands
438
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
439
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The `planopticon kg` command group provides utilities for managing knowledge graph files.
440
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
441
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### kg convert
442
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
443
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Convert a knowledge graph between SQLite and JSON formats:
444
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
445
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
446
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# SQLite to JSON
447
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon kg convert results/knowledge_graph.db output.json
448
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
449
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# JSON to SQLite
450
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon kg convert knowledge_graph.json knowledge_graph.db
451
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
452
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
453
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The output format is inferred from the destination file extension. Source and destination must be different formats.
454
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
455
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### kg sync
456
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
457
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Synchronize a `.db` and `.json` knowledge graph, updating the stale one:
458
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
459
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
460
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Auto-detect which is newer and sync
461
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon kg sync results/knowledge_graph.db
462
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
463
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Explicit JSON path
464
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon kg sync knowledge_graph.db knowledge_graph.json
465
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
466
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Force a specific direction
467
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon kg sync knowledge_graph.db knowledge_graph.json --direction db-to-json
468
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon kg sync knowledge_graph.db knowledge_graph.json --direction json-to-db
469
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
470
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
471
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
If `JSON_PATH` is omitted, the `.json` path is derived from the `.db` path (same name, different extension). In `auto` mode (the default), the newer file is used as the source.
472
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
473
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### kg inspect
474
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
475
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Show summary statistics for a knowledge graph file:
476
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
477
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
478
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon kg inspect results/knowledge_graph.db
479
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
480
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
481
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Output:
482
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
483
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
484
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
File: results/knowledge_graph.db
485
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Store: sqlite
486
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Entities: 42
487
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Relationships: 87
488
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Entity types:
489
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
technology: 15
490
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
person: 12
491
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
concept: 10
492
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
organization: 5
493
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
494
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
495
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Works with both `.db` and `.json` files.
496
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
497
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### kg classify
498
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
499
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Classify knowledge graph entities into planning taxonomy types:
500
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
501
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
502
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Heuristic + LLM classification
503
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon kg classify results/knowledge_graph.db
504
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
505
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Heuristic only (no API key needed)
506
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon kg classify results/knowledge_graph.db -p none
507
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
508
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# JSON output
509
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon kg classify results/knowledge_graph.db --format json
510
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
511
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
512
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Text output groups entities by planning type:
513
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
514
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
515
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
GOALS (3)
516
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Improve system reliability [high]
517
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Must achieve 99.9% uptime
518
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Reduce deployment time [medium]
519
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Automate the deployment pipeline
520
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
521
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
RISKS (2)
522
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Data migration complexity [high]
523
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Legacy schema incompatibilities
524
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
...
525
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
526
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
TASKS (5)
527
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Implement OAuth2 flow
528
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Set up authentication service
529
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
...
530
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
531
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
532
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
JSON output returns an array of `PlanningEntity` objects with `name`, `planning_type`, `priority`, `description`, and `source_entities` fields.
533
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
534
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### kg from-exchange
535
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
536
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Import a PlanOpticonExchange JSON file into a knowledge graph database:
537
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
538
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
539
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Import to default location (./knowledge_graph.db)
540
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon kg from-exchange exchange.json
541
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
542
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Import to a specific path
543
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon kg from-exchange exchange.json -o project.db
544
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
545
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
546
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The PlanOpticonExchange format is a standardized interchange format that includes entities, relationships, and source records.
547
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
548
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
549
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
550
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Output Formats
551
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
552
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Query results can be output in three formats:
553
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
554
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Text (default)
555
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
556
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Human-readable format with entity types in brackets, relationship arrows, and indented details:
557
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
558
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
559
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Found 15 entities
560
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
[technology] Python -- General-purpose programming language
561
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
[person] Alice -- Lead engineer on the project
562
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
[concept] Microservices -- Architectural pattern discussed
563
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
564
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
565
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### JSON
566
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
567
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Full structured output including query metadata:
568
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
569
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
570
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon query --format json stats
571
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
572
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
573
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```json
574
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{
575
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"query_type": "filter",
576
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"raw_query": "stats()",
577
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"explanation": "Knowledge graph statistics",
578
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"data": {
579
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"entity_count": 42,
580
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"relationship_count": 87,
581
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"entity_types": {
582
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"technology": 15,
583
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"person": 12
584
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
585
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
586
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
587
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
588
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
589
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Mermaid
590
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
591
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Graph results rendered as Mermaid diagram syntax, ready for embedding in markdown:
592
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
593
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
594
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon query --format mermaid "neighbors Alice"
595
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
596
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
597
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
598
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
graph LR
599
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Alice["Alice"]:::person
600
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Python["Python"]:::technology
601
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Kubernetes["Kubernetes"]:::technology
602
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Alice -- "expert_in" --> Kubernetes
603
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Alice -- "works_with" --> Python
604
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
classDef person fill:#f9d5e5,stroke:#333
605
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
classDef concept fill:#eeeeee,stroke:#333
606
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
classDef technology fill:#d5e5f9,stroke:#333
607
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
classDef organization fill:#f9e5d5,stroke:#333
608
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
609
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
610
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The `KnowledgeGraph.generate_mermaid()` method also produces full-graph Mermaid diagrams, capped at the top 30 most-connected nodes by default.
611
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
612
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
613
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
614
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Auto-Discovery
615
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
616
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
PlanOpticon automatically locates knowledge graph files using the `find_nearest_graph()` function. The search order is:
617
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
618
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
1. **Current directory** -- check for `knowledge_graph.db` and `knowledge_graph.json`
619
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
2. **Common subdirectories** -- `results/`, `output/`, `knowledge-base/`
620
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
3. **Recursive downward walk** -- up to 4 levels deep, skipping hidden directories
621
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
4. **Parent directory walk** -- upward through the directory tree, checking each level and its common subdirectories
622
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
623
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Within each search phase, `.db` files are preferred over `.json` files. Results are sorted by proximity (closest first).
624
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
625
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
626
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
from video_processor.integrators.graph_discovery import (
627
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
find_nearest_graph,
628
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
find_knowledge_graphs,
629
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
describe_graph,
630
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
)
631
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
632
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Find the single closest knowledge graph
633
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
path = find_nearest_graph()
634
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
635
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Find all knowledge graphs, sorted by proximity
636
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
paths = find_knowledge_graphs()
637
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
638
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Find graphs starting from a specific directory
639
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
paths = find_knowledge_graphs(start_dir="/path/to/project")
640
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
641
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Disable upward walking
642
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
paths = find_knowledge_graphs(walk_up=False)
643
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
644
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Get summary stats without loading the full graph
645
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
info = describe_graph(path)
646
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# {"entity_count": 42, "relationship_count": 87,
647
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# "entity_types": {...}, "store_type": "sqlite"}
648
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
649
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
650
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Auto-discovery is used by the Companion REPL, the `planopticon query` command, and the planning agent when no explicit `--kb` path is provided.
651
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!