{
"tool_response": {
"type": "text",
"file": {
"filePath": "\/var\/www\/dev.campus.systemische-tools.de\/src\/Infrastructure\/SemanticExplorerRepository.php",
"content": " $path = $name;\n\n if ($parentId !== null) {\n $parent = $this->getTaxonomyTerm($parentId);\n if ($parent !== null) {\n $depth = (int) $parent['depth'] + 1;\n $path = $parent['path'] . '\/' . $name;\n }\n }\n\n $stmt = $this->db->prepare(\n 'INSERT INTO taxonomy_terms (name, parent_id, depth, path, created_at)\n VALUES (:name, :parent, :depth, :path, NOW())'\n );\n $stmt->execute([\n 'name' => $name,\n 'parent' => $parentId,\n 'depth' => $depth,\n 'path' => $path,\n ]);\n\n return (int) $this->db->lastInsertId();\n }\n\n public function updateTaxonomyTerm(int $id, string $name, ?int $parentId = null): bool\n {\n \/\/ Calculate new depth and path\n $depth = 0;\n $path = $name;\n\n if ($parentId !== null) {\n $parent = $this->getTaxonomyTerm($parentId);\n if ($parent !== null) {\n $depth = (int) $parent['depth'] + 1;\n $path = $parent['path'] . '\/' . $name;\n }\n }\n\n $stmt = $this->db->prepare(\n 'UPDATE taxonomy_terms SET name = :name, parent_id = :parent, depth = :depth, path = :path WHERE id = :id'\n );\n\n return $stmt->execute([\n 'id' => $id,\n 'name' => $name,\n 'parent' => $parentId,\n 'depth' => $depth,\n 'path' => $path,\n ]);\n }\n\n public function deleteTaxonomyTerm(int $id): bool\n {\n \/\/ Check for children\n $stmt = $this->db->prepare('SELECT COUNT(*) FROM taxonomy_terms WHERE parent_id = :id');\n $stmt->execute(['id' => $id]);\n\n if ((int) $stmt->fetchColumn() > 0) {\n return false; \/\/ Has children, cannot delete\n }\n\n \/\/ Delete chunk associations\n $stmt = $this->db->prepare('DELETE FROM chunk_taxonomy WHERE taxonomy_term_id = :id');\n $stmt->execute(['id' => $id]);\n\n \/\/ Delete term\n $stmt = $this->db->prepare('DELETE FROM taxonomy_terms WHERE id = :id');\n\n return $stmt->execute(['id' => $id]);\n }\n\n public function getTaxonomyTermsForSelect(): array\n {\n return $this->db->query(\n 'SELECT id, name, depth, path FROM taxonomy_terms ORDER BY path, name'\n )->fetchAll();\n }\n\n \/\/ =========================================================================\n \/\/ ONTOLOGY - CRUD\n \/\/ =========================================================================\n\n public function getOntologyClass(int $id): ?array\n {\n $stmt = $this->db->prepare('SELECT * FROM ontology_classes WHERE id = :id');\n $stmt->execute(['id' => $id]);\n $result = $stmt->fetch();\n\n return $result === false ? null : $result;\n }\n\n public function createOntologyClass(string $name, ?int $parentId = null, ?string $description = null, array $properties = []): int\n {\n $stmt = $this->db->prepare(\n 'INSERT INTO ontology_classes (name, parent_class_id, description, properties, created_at)\n VALUES (:name, :parent, :description, :properties, NOW())'\n );\n $stmt->execute([\n 'name' => $name,\n 'parent' => $parentId,\n 'description' => $description,\n 'properties' => json_encode($properties),\n ]);\n\n return (int) $this->db->lastInsertId();\n }\n\n public function updateOntologyClass(int $id, string $name, ?int $parentId = null, ?string $description = null, array $properties = []): bool\n {\n $stmt = $this->db->prepare(\n 'UPDATE ontology_classes SET name = :name, parent_class_id = :parent,\n description = :description, properties = :properties WHERE id = :id'\n );\n\n return $stmt->execute([\n 'id' => $id,\n 'name' => $name,\n 'parent' => $parentId,\n 'description' => $description,\n 'properties' => json_encode($properties),\n ]);\n }\n\n public function deleteOntologyClass(int $id): bool\n {\n \/\/ Check for subclasses\n $stmt = $this->db->prepare('SELECT COUNT(*) FROM ontology_classes WHERE parent_class_id = :id');\n $stmt->execute(['id' => $id]);\n\n if ((int) $stmt->fetchColumn() > 0) {\n return false; \/\/ Has subclasses, cannot delete\n }\n\n \/\/ Delete entity classifications\n $stmt = $this->db->prepare('DELETE FROM entity_classifications WHERE ontology_class_id = :id');\n $stmt->execute(['id' => $id]);\n\n \/\/ Delete class\n $stmt = $this->db->prepare('DELETE FROM ontology_classes WHERE id = :id');\n\n return $stmt->execute(['id' => $id]);\n }\n\n public function getOntologyClassesForSelect(): array\n {\n return $this->db->query('SELECT id, name FROM ontology_classes ORDER BY name')->fetchAll();\n }\n\n \/\/ =========================================================================\n \/\/ GRAPH\n \/\/ =========================================================================\n\n \/**\n * Returns graph data for D3.js visualization.\n *\n * @return array{nodes: array, links: array, stats: array}\n *\/\n public function getGraphData(): array\n {\n \/\/ Get all entities\n $entities = $this->db->query(\n 'SELECT id, name, type FROM entities ORDER BY name'\n )->fetchAll();\n\n \/\/ Get all relations\n $relations = $this->db->query(\n 'SELECT source_entity_id, target_entity_id, relation_type, strength\n FROM entity_relations'\n )->fetchAll();\n\n \/\/ Build node index for link resolution\n $nodeIndex = [];\n $nodes = [];\n foreach ($entities as $i => $entity) {\n $nodeIndex[$entity['id']] = $i;\n $nodes[] = [\n 'id' => 'entity_' . $entity['id'],\n 'label' => $entity['name'],\n 'type' => strtoupper($entity['type'] ?? 'OTHER'),\n 'entityId' => (int) $entity['id'],\n ];\n }\n\n \/\/ Build links with index references\n $links = [];\n foreach ($relations as $relation) {\n $sourceId = $relation['source_entity_id'];\n $targetId = $relation['target_entity_id'];\n\n \/\/ Skip if entity not found\n if (!isset($nodeIndex[$sourceId]) || !isset($nodeIndex[$targetId])) {\n continue;\n }\n\n $links[] = [\n 'source' => $nodeIndex[$sourceId],\n 'target' => $nodeIndex[$targetId],\n 'type' => $relation['relation_type'],\n 'strength' => (float) ($relation['strength'] ?? 1.0),\n ];",
"numLines": 200,
"startLine": 700,
"totalLines": 918
}
}
}