From 15cb154a19cabb5c3c66491a61f215ef104d5280 Mon Sep 17 00:00:00 2001
From: TevinClaw <510129976@qq.com>
Date: Sat, 14 Mar 2026 13:03:06 +0800
Subject: [PATCH] feat(早报): 增加昨日总结模块
---
workspace/skills/ontology/references/queries.md | 211 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 211 insertions(+), 0 deletions(-)
diff --git a/workspace/skills/ontology/references/queries.md b/workspace/skills/ontology/references/queries.md
new file mode 100644
index 0000000..fefb678
--- /dev/null
+++ b/workspace/skills/ontology/references/queries.md
@@ -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)
+```
--
Gitblit v1.9.1