@@ -110,10 +110,36 @@
110 110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"""Check if a relationship exists between two entities.
111 111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112 112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
If edge_label is None, checks for any relationship type.
113 113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"""
114 114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
...
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def register_source(self, source: Dict[str, Any]) -> None:
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ """Register a content source. Default no-op for backends that don't support it."""
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pass
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def get_sources(self) -> List[Dict[str, Any]]:
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ """Return all registered sources."""
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return []
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def get_source(self, source_id: str) -> Optional[Dict[str, Any]]:
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ """Get a source by ID."""
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return None
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def add_source_location(
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ self,
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ source_id: str,
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ entity_name_lower: Optional[str] = None,
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ relationship_id: Optional[int] = None,
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **kwargs,
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ) -> None:
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ """Link a source to an entity or relationship with location details."""
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pass
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def get_entity_provenance(self, name: str) -> List[Dict[str, Any]]:
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ """Get all source locations for an entity."""
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return []
115 141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
116 142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
def raw_query(self, query_string: str) -> Any:
117 143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"""Execute a raw query against the backend (e.g. SQL for SQLite).
118 144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
119 145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Not supported by all backends — raises NotImplementedError by default.
@@ -135,19 +161,25 @@
135 161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"type": e.get("type", "concept"),
136 162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"descriptions": descs,
137 163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"occurrences": e.get("occurrences", []),
138 164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
139 165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
)
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return {"nodes": nodes, "relationships": self.get_all_relationships()}
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ result = {"nodes": nodes, "relationships": self.get_all_relationships()}
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sources = self.get_sources()
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if sources:
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ result["sources"] = sources
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return result
141 171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
142 172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
143 173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
class InMemoryStore(GraphStore):
144 174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"""In-memory graph store using Python dicts. Default fallback."""
145 175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
146 176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
def __init__(self) -> None:
147 177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
self._nodes: Dict[str, Dict[str, Any]] = {} # keyed by name.lower()
148 178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
self._relationships: List[Dict[str, Any]] = []
179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ self._sources: Dict[str, Dict[str, Any]] = {} # keyed by source_id
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ self._source_locations: List[Dict[str, Any]] = []
149 181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
150 182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
def merge_entity(
151 183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
self,
152 184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
name: str,
153 185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
entity_type: str,
@@ -241,10 +273,47 @@
241 273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
key = name.lower()
242 274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if key not in self._nodes:
243 275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return False
244 276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
self._nodes[key].update(properties)
245 277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return True
278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def register_source(self, source: Dict[str, Any]) -> None:
280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ source_id = source.get("source_id", "")
281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ self._sources[source_id] = dict(source)
282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def get_sources(self) -> List[Dict[str, Any]]:
284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return list(self._sources.values())
285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def get_source(self, source_id: str) -> Optional[Dict[str, Any]]:
287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return self._sources.get(source_id)
288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def add_source_location(
290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ self,
291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ source_id: str,
292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ entity_name_lower: Optional[str] = None,
293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ relationship_id: Optional[int] = None,
294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **kwargs,
295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ) -> None:
296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ entry: Dict[str, Any] = {
297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "source_id": source_id,
298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "entity_name_lower": entity_name_lower,
299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "relationship_id": relationship_id,
300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ entry.update(kwargs)
302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ self._source_locations.append(entry)
303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def get_entity_provenance(self, name: str) -> List[Dict[str, Any]]:
305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ name_lower = name.lower()
306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ results = []
307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for loc in self._source_locations:
308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if loc.get("entity_name_lower") == name_lower:
309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ entry = dict(loc)
310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ src = self._sources.get(loc.get("source_id", ""))
311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if src:
312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ entry["source"] = src
313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ results.append(entry)
314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return results
246 315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
247 316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
def has_relationship(
248 317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
self,
249 318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
source: str,
250 319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
target: str,
@@ -289,10 +358,36 @@
289 358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
CREATE INDEX IF NOT EXISTS idx_entities_name_lower ON entities(name_lower);
290 359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
CREATE INDEX IF NOT EXISTS idx_entities_type ON entities(type);
291 360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
CREATE INDEX IF NOT EXISTS idx_occurrences_entity ON occurrences(entity_name_lower);
292 361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
CREATE INDEX IF NOT EXISTS idx_relationships_source ON relationships(source);
293 362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
CREATE INDEX IF NOT EXISTS idx_relationships_target ON relationships(target);
363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ CREATE TABLE IF NOT EXISTS sources (
365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ source_id TEXT PRIMARY KEY,
366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ source_type TEXT NOT NULL,
367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ title TEXT NOT NULL,
368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ path TEXT,
369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ url TEXT,
370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mime_type TEXT,
371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ingested_at TEXT NOT NULL,
372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ metadata TEXT NOT NULL DEFAULT '{}'
373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ CREATE TABLE IF NOT EXISTS source_locations (
375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ source_id TEXT NOT NULL REFERENCES sources(source_id),
377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ entity_name_lower TEXT,
378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ relationship_id INTEGER,
379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ timestamp REAL,
380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ page INTEGER,
381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ section TEXT,
382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ line_start INTEGER,
383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ line_end INTEGER,
384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ text_snippet TEXT
385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ CREATE INDEX IF NOT EXISTS idx_source_locations_source ON source_locations(source_id);
387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ CREATE INDEX IF NOT EXISTS idx_source_locations_entity
388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ON source_locations(entity_name_lower);
294 389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"""
295 390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
296 391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
def __init__(self, db_path: Union[str, Path]) -> None:
297 392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
self._db_path = str(db_path)
298 393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
self._conn = sqlite3.connect(self._db_path)
@@ -497,10 +592,149 @@
497 592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
row = self._conn.execute(
498 593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"SELECT 1 FROM relationships WHERE LOWER(source) = ? AND LOWER(target) = ?",
499 594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
(source.lower(), target.lower()),
500 595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
).fetchone()
501 596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return row is not None
597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def register_source(self, source: Dict[str, Any]) -> None:
599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ source_id = source.get("source_id", "")
600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ existing = self._conn.execute(
601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "SELECT 1 FROM sources WHERE source_id = ?", (source_id,)
602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ).fetchone()
603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if existing:
604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ self._conn.execute(
605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "UPDATE sources SET source_type = ?, title = ?, path = ?, url = ?, "
606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "mime_type = ?, ingested_at = ?, metadata = ? WHERE source_id = ?",
607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (
608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ source.get("source_type", ""),
609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ source.get("title", ""),
610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ source.get("path"),
611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ source.get("url"),
612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ source.get("mime_type"),
613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ source.get("ingested_at", ""),
614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ json.dumps(source.get("metadata", {})),
615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ source_id,
616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ),
617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ else:
619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ self._conn.execute(
620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "INSERT INTO sources (source_id, source_type, title, path, url, "
621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "mime_type, ingested_at, metadata) VALUES (?, ?, ?, ?, ?, ?, ?, ?)",
622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (
623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ source_id,
624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ source.get("source_type", ""),
625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ source.get("title", ""),
626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ source.get("path"),
627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ source.get("url"),
628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ source.get("mime_type"),
629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ source.get("ingested_at", ""),
630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ json.dumps(source.get("metadata", {})),
631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ),
632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ self._conn.commit()
634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def get_sources(self) -> List[Dict[str, Any]]:
636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rows = self._conn.execute(
637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "SELECT source_id, source_type, title, path, url, mime_type, "
638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "ingested_at, metadata FROM sources"
639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ).fetchall()
640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return [
641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ {
642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "source_id": r[0],
643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "source_type": r[1],
644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "title": r[2],
645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "path": r[3],
646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "url": r[4],
647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "mime_type": r[5],
648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "ingested_at": r[6],
649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "metadata": json.loads(r[7]) if r[7] else {},
650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for r in rows
652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ]
653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def get_source(self, source_id: str) -> Optional[Dict[str, Any]]:
655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ row = self._conn.execute(
656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "SELECT source_id, source_type, title, path, url, mime_type, "
657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "ingested_at, metadata FROM sources WHERE source_id = ?",
658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (source_id,),
659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ).fetchone()
660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if not row:
661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return None
662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return {
663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "source_id": row[0],
664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "source_type": row[1],
665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "title": row[2],
666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "path": row[3],
667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "url": row[4],
668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "mime_type": row[5],
669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "ingested_at": row[6],
670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "metadata": json.loads(row[7]) if row[7] else {},
671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def add_source_location(
674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ self,
675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ source_id: str,
676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ entity_name_lower: Optional[str] = None,
677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ relationship_id: Optional[int] = None,
678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **kwargs,
679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ) -> None:
680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ self._conn.execute(
681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "INSERT INTO source_locations (source_id, entity_name_lower, relationship_id, "
682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "timestamp, page, section, line_start, line_end, text_snippet) "
683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (
685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ source_id,
686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ entity_name_lower,
687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ relationship_id,
688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ kwargs.get("timestamp"),
689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ kwargs.get("page"),
690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ kwargs.get("section"),
691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ kwargs.get("line_start"),
692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ kwargs.get("line_end"),
693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ kwargs.get("text_snippet"),
694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ),
695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ self._conn.commit()
697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def get_entity_provenance(self, name: str) -> List[Dict[str, Any]]:
699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ name_lower = name.lower()
700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rows = self._conn.execute(
701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "SELECT sl.source_id, sl.entity_name_lower, sl.relationship_id, "
702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "sl.timestamp, sl.page, sl.section, sl.line_start, sl.line_end, "
703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "sl.text_snippet, s.source_type, s.title, s.path, s.url, s.mime_type, "
704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "s.ingested_at, s.metadata "
705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "FROM source_locations sl "
706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "JOIN sources s ON sl.source_id = s.source_id "
707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "WHERE sl.entity_name_lower = ?",
708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (name_lower,),
709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ).fetchall()
710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ results = []
711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for r in rows:
712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ results.append(
713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ {
714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "source_id": r[0],
715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "entity_name_lower": r[1],
716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "relationship_id": r[2],
717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "timestamp": r[3],
718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "page": r[4],
719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "section": r[5],
720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "line_start": r[6],
721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "line_end": r[7],
722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "text_snippet": r[8],
723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "source": {
724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "source_id": r[0],
725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "source_type": r[9],
726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "title": r[10],
727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "path": r[11],
728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "url": r[12],
729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "mime_type": r[13],
730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "ingested_at": r[14],
731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "metadata": json.loads(r[15]) if r[15] else {},
732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return results
502 736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
503 737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
def close(self) -> None:
504 738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"""Close the SQLite connection."""
505 739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if self._conn:
506 740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
self._conn.close()
507 741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!