Initial commit with translated description
This commit is contained in:
211
references/queries.md
Normal file
211
references/queries.md
Normal file
@@ -0,0 +1,211 @@
|
||||
# Query Reference
|
||||
|
||||
Query patterns and graph traversal examples.
|
||||
|
||||
## Basic Queries
|
||||
|
||||
### Get by ID
|
||||
|
||||
```bash
|
||||
python3 scripts/ontology.py get --id task_001
|
||||
```
|
||||
|
||||
### List by Type
|
||||
|
||||
```bash
|
||||
# All tasks
|
||||
python3 scripts/ontology.py list --type Task
|
||||
|
||||
# All people
|
||||
python3 scripts/ontology.py list --type Person
|
||||
```
|
||||
|
||||
### Filter by Properties
|
||||
|
||||
```bash
|
||||
# Open tasks
|
||||
python3 scripts/ontology.py query --type Task --where '{"status":"open"}'
|
||||
|
||||
# High priority tasks
|
||||
python3 scripts/ontology.py query --type Task --where '{"priority":"high"}'
|
||||
|
||||
# Tasks assigned to specific person (by property)
|
||||
python3 scripts/ontology.py query --type Task --where '{"assignee":"p_001"}'
|
||||
```
|
||||
|
||||
## Relation Queries
|
||||
|
||||
### Get Related Entities
|
||||
|
||||
```bash
|
||||
# Tasks belonging to a project (outgoing)
|
||||
python3 scripts/ontology.py related --id proj_001 --rel has_task
|
||||
|
||||
# What projects does this task belong to (incoming)
|
||||
python3 scripts/ontology.py related --id task_001 --rel part_of --dir incoming
|
||||
|
||||
# All relations for an entity (both directions)
|
||||
python3 scripts/ontology.py related --id p_001 --dir both
|
||||
```
|
||||
|
||||
### Common Patterns
|
||||
|
||||
```bash
|
||||
# Who owns this project?
|
||||
python3 scripts/ontology.py related --id proj_001 --rel has_owner
|
||||
|
||||
# What events is this person attending?
|
||||
python3 scripts/ontology.py related --id p_001 --rel attendee_of --dir outgoing
|
||||
|
||||
# What's blocking this task?
|
||||
python3 scripts/ontology.py related --id task_001 --rel blocked_by --dir incoming
|
||||
```
|
||||
|
||||
## Programmatic Queries
|
||||
|
||||
### Python API
|
||||
|
||||
```python
|
||||
from scripts.ontology import load_graph, query_entities, get_related
|
||||
|
||||
# Load the graph
|
||||
entities, relations = load_graph("memory/ontology/graph.jsonl")
|
||||
|
||||
# Query entities
|
||||
open_tasks = query_entities("Task", {"status": "open"}, "memory/ontology/graph.jsonl")
|
||||
|
||||
# Get related
|
||||
project_tasks = get_related("proj_001", "has_task", "memory/ontology/graph.jsonl")
|
||||
```
|
||||
|
||||
### Complex Queries
|
||||
|
||||
```python
|
||||
# Find all tasks blocked by incomplete dependencies
|
||||
def find_blocked_tasks(graph_path):
|
||||
entities, relations = load_graph(graph_path)
|
||||
blocked = []
|
||||
|
||||
for entity in entities.values():
|
||||
if entity["type"] != "Task":
|
||||
continue
|
||||
if entity["properties"].get("status") == "blocked":
|
||||
# Find what's blocking it
|
||||
blockers = get_related(entity["id"], "blocked_by", graph_path, "incoming")
|
||||
incomplete_blockers = [
|
||||
b for b in blockers
|
||||
if b["entity"]["properties"].get("status") != "done"
|
||||
]
|
||||
if incomplete_blockers:
|
||||
blocked.append({
|
||||
"task": entity,
|
||||
"blockers": incomplete_blockers
|
||||
})
|
||||
|
||||
return blocked
|
||||
```
|
||||
|
||||
### Path Queries
|
||||
|
||||
```python
|
||||
# Find path between two entities
|
||||
def find_path(from_id, to_id, graph_path, max_depth=5):
|
||||
entities, relations = load_graph(graph_path)
|
||||
|
||||
visited = set()
|
||||
queue = [(from_id, [])]
|
||||
|
||||
while queue:
|
||||
current, path = queue.pop(0)
|
||||
|
||||
if current == to_id:
|
||||
return path
|
||||
|
||||
if current in visited or len(path) >= max_depth:
|
||||
continue
|
||||
|
||||
visited.add(current)
|
||||
|
||||
for rel in relations:
|
||||
if rel["from"] == current and rel["to"] not in visited:
|
||||
queue.append((rel["to"], path + [rel]))
|
||||
if rel["to"] == current and rel["from"] not in visited:
|
||||
queue.append((rel["from"], path + [{**rel, "direction": "incoming"}]))
|
||||
|
||||
return None # No path found
|
||||
```
|
||||
|
||||
## Query Patterns by Use Case
|
||||
|
||||
### Task Management
|
||||
|
||||
```bash
|
||||
# All my open tasks
|
||||
python3 scripts/ontology.py query --type Task --where '{"status":"open","assignee":"p_me"}'
|
||||
|
||||
# Overdue tasks (requires custom script for date comparison)
|
||||
# See references/schema.md for date handling
|
||||
|
||||
# Tasks with no blockers
|
||||
python3 scripts/ontology.py query --type Task --where '{"status":"open"}'
|
||||
# Then filter in code for those with no incoming "blocks" relations
|
||||
```
|
||||
|
||||
### Project Overview
|
||||
|
||||
```bash
|
||||
# All tasks in project
|
||||
python3 scripts/ontology.py related --id proj_001 --rel has_task
|
||||
|
||||
# Project team members
|
||||
python3 scripts/ontology.py related --id proj_001 --rel has_member
|
||||
|
||||
# Project goals
|
||||
python3 scripts/ontology.py related --id proj_001 --rel has_goal
|
||||
```
|
||||
|
||||
### People & Contacts
|
||||
|
||||
```bash
|
||||
# All people
|
||||
python3 scripts/ontology.py list --type Person
|
||||
|
||||
# People in an organization
|
||||
python3 scripts/ontology.py related --id org_001 --rel has_member
|
||||
|
||||
# What's assigned to this person
|
||||
python3 scripts/ontology.py related --id p_001 --rel assigned_to --dir incoming
|
||||
```
|
||||
|
||||
### Events & Calendar
|
||||
|
||||
```bash
|
||||
# All events
|
||||
python3 scripts/ontology.py list --type Event
|
||||
|
||||
# Events at a location
|
||||
python3 scripts/ontology.py related --id loc_001 --rel located_at --dir incoming
|
||||
|
||||
# Event attendees
|
||||
python3 scripts/ontology.py related --id event_001 --rel attendee_of --dir incoming
|
||||
```
|
||||
|
||||
## Aggregations
|
||||
|
||||
For complex aggregations, use Python:
|
||||
|
||||
```python
|
||||
from collections import Counter
|
||||
|
||||
def task_status_summary(project_id, graph_path):
|
||||
"""Count tasks by status for a project."""
|
||||
tasks = get_related(project_id, "has_task", graph_path)
|
||||
statuses = Counter(t["entity"]["properties"].get("status", "unknown") for t in tasks)
|
||||
return dict(statuses)
|
||||
|
||||
def workload_by_person(graph_path):
|
||||
"""Count open tasks per person."""
|
||||
open_tasks = query_entities("Task", {"status": "open"}, graph_path)
|
||||
workload = Counter(t["properties"].get("assignee") for t in open_tasks)
|
||||
return dict(workload)
|
||||
```
|
||||
Reference in New Issue
Block a user