Files
lore-engine-poc/neo4j/init.cypher
Hermes add264eb04 T2: pgvector image embeddings — plugin, schema, seed, hook, tests
- docker-compose: swap postgres image to pgvector/pgvector:pg16
- postgres/init.sql: CREATE EXTENSION vector; image_embedding table
- plugins/embeddings.py: embed_images + search_images_semantic
  (sentence-transformers all-MiniLM-L6-v2, lazy-loaded, pgvector <=> cosine)
- plugins/images.py: register_image kicks off background embed worker
- seed.py: seed_embeddings writes 4 embeddings for the mock images
- README: semantic image search section + T3 note
- 11 tests across 4 files, all green:
    test_embeddings_plugin.py (4): schema, ordering, idempotency, stub
    test_embeddings_real_model.py (3): real MiniLM, acceptance queries
    test_register_image_hook.py (2): manifest row, end-to-end hook
    test_seed_embeddings.py (2): writes 4, idempotent
- Includes T3 consistency plugin skeleton (4 stub tools)
2026-06-16 14:30:10 +00:00

31 lines
2.3 KiB
Plaintext

// Lore Engine POC — minimal schema for the closed-world ontology.
// Mirrors the design in lore-engine/docs/01-ontology.md, scoped for the POC.
CREATE CONSTRAINT person_id IF NOT EXISTS FOR (p:Person) REQUIRE p.id IS UNIQUE;
CREATE CONSTRAINT faction_id IF NOT EXISTS FOR (f:Faction) REQUIRE f.id IS UNIQUE;
CREATE CONSTRAINT location_id IF NOT EXISTS FOR (l:Location) REQUIRE l.id IS UNIQUE;
CREATE CONSTRAINT era_slug IF NOT EXISTS FOR (e:Era) REQUIRE e.slug IS UNIQUE;
CREATE CONSTRAINT event_id IF NOT EXISTS FOR (e:Event) REQUIRE e.id IS UNIQUE;
CREATE CONSTRAINT item_id IF NOT EXISTS FOR (i:Item) REQUIRE i.id IS UNIQUE;
CREATE CONSTRAINT lineage_id IF NOT EXISTS FOR (l:Lineage) REQUIRE l.id IS UNIQUE;
// Consistency engine — violation nodes (v2.T3 stub; detection logic lands in T5).
// id is the canonical unique key. type, severity, status are free-form props.
CREATE CONSTRAINT contradiction_id IF NOT EXISTS FOR (n:Contradiction) REQUIRE n.id IS UNIQUE;
CREATE CONSTRAINT anachronism_id IF NOT EXISTS FOR (n:Anachronism) REQUIRE n.id IS UNIQUE;
CREATE CONSTRAINT orphan_id IF NOT EXISTS FOR (n:Orphan) REQUIRE n.id IS UNIQUE;
CREATE CONSTRAINT ontology_violation_id IF NOT EXISTS FOR (n:OntologyViolation) REQUIRE n.id IS UNIQUE;
CREATE INDEX violation_severity IF NOT EXISTS FOR (n:Contradiction) ON (n.severity);
CREATE INDEX violation_severity_anc IF NOT EXISTS FOR (n:Anachronism) ON (n.severity);
CREATE INDEX violation_severity_ont IF NOT EXISTS FOR (n:OntologyViolation) ON (n.severity);
CREATE INDEX violation_status IF NOT EXISTS FOR (n:Contradiction) ON (n.status);
CREATE INDEX violation_status_anc IF NOT EXISTS FOR (n:Anachronism) ON (n.status);
CREATE INDEX violation_status_ont IF NOT EXISTS FOR (n:OntologyViolation) ON (n.status);
CREATE INDEX violation_status_orph IF NOT EXISTS FOR (n:Orphan) ON (n.status);
CREATE INDEX era_parent IF NOT EXISTS FOR (e:Era) ON (e.parent_slug);
CREATE INDEX person_tier IF NOT EXISTS FOR (p:Person) ON (p.tier);
// Era tree: every Era has CONTAINS sub-eras or PART_OF parents
// (:Era {slug, name, start, end}) -[:PART_OF]-> (:Era)