aiecs 1.5.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- aiecs/__init__.py +72 -0
- aiecs/__main__.py +41 -0
- aiecs/aiecs_client.py +469 -0
- aiecs/application/__init__.py +10 -0
- aiecs/application/executors/__init__.py +10 -0
- aiecs/application/executors/operation_executor.py +363 -0
- aiecs/application/knowledge_graph/__init__.py +7 -0
- aiecs/application/knowledge_graph/builder/__init__.py +37 -0
- aiecs/application/knowledge_graph/builder/document_builder.py +375 -0
- aiecs/application/knowledge_graph/builder/graph_builder.py +356 -0
- aiecs/application/knowledge_graph/builder/schema_mapping.py +531 -0
- aiecs/application/knowledge_graph/builder/structured_pipeline.py +443 -0
- aiecs/application/knowledge_graph/builder/text_chunker.py +319 -0
- aiecs/application/knowledge_graph/extractors/__init__.py +27 -0
- aiecs/application/knowledge_graph/extractors/base.py +100 -0
- aiecs/application/knowledge_graph/extractors/llm_entity_extractor.py +327 -0
- aiecs/application/knowledge_graph/extractors/llm_relation_extractor.py +349 -0
- aiecs/application/knowledge_graph/extractors/ner_entity_extractor.py +244 -0
- aiecs/application/knowledge_graph/fusion/__init__.py +23 -0
- aiecs/application/knowledge_graph/fusion/entity_deduplicator.py +387 -0
- aiecs/application/knowledge_graph/fusion/entity_linker.py +343 -0
- aiecs/application/knowledge_graph/fusion/knowledge_fusion.py +580 -0
- aiecs/application/knowledge_graph/fusion/relation_deduplicator.py +189 -0
- aiecs/application/knowledge_graph/pattern_matching/__init__.py +21 -0
- aiecs/application/knowledge_graph/pattern_matching/pattern_matcher.py +344 -0
- aiecs/application/knowledge_graph/pattern_matching/query_executor.py +378 -0
- aiecs/application/knowledge_graph/profiling/__init__.py +12 -0
- aiecs/application/knowledge_graph/profiling/query_plan_visualizer.py +199 -0
- aiecs/application/knowledge_graph/profiling/query_profiler.py +223 -0
- aiecs/application/knowledge_graph/reasoning/__init__.py +27 -0
- aiecs/application/knowledge_graph/reasoning/evidence_synthesis.py +347 -0
- aiecs/application/knowledge_graph/reasoning/inference_engine.py +504 -0
- aiecs/application/knowledge_graph/reasoning/logic_form_parser.py +167 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/__init__.py +79 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/ast_builder.py +513 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/ast_nodes.py +630 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/ast_validator.py +654 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/error_handler.py +477 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/parser.py +390 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/query_context.py +217 -0
- aiecs/application/knowledge_graph/reasoning/logic_query_integration.py +169 -0
- aiecs/application/knowledge_graph/reasoning/query_planner.py +872 -0
- aiecs/application/knowledge_graph/reasoning/reasoning_engine.py +554 -0
- aiecs/application/knowledge_graph/retrieval/__init__.py +19 -0
- aiecs/application/knowledge_graph/retrieval/retrieval_strategies.py +596 -0
- aiecs/application/knowledge_graph/search/__init__.py +59 -0
- aiecs/application/knowledge_graph/search/hybrid_search.py +423 -0
- aiecs/application/knowledge_graph/search/reranker.py +295 -0
- aiecs/application/knowledge_graph/search/reranker_strategies.py +553 -0
- aiecs/application/knowledge_graph/search/text_similarity.py +398 -0
- aiecs/application/knowledge_graph/traversal/__init__.py +15 -0
- aiecs/application/knowledge_graph/traversal/enhanced_traversal.py +329 -0
- aiecs/application/knowledge_graph/traversal/path_scorer.py +269 -0
- aiecs/application/knowledge_graph/validators/__init__.py +13 -0
- aiecs/application/knowledge_graph/validators/relation_validator.py +189 -0
- aiecs/application/knowledge_graph/visualization/__init__.py +11 -0
- aiecs/application/knowledge_graph/visualization/graph_visualizer.py +321 -0
- aiecs/common/__init__.py +9 -0
- aiecs/common/knowledge_graph/__init__.py +17 -0
- aiecs/common/knowledge_graph/runnable.py +484 -0
- aiecs/config/__init__.py +16 -0
- aiecs/config/config.py +498 -0
- aiecs/config/graph_config.py +137 -0
- aiecs/config/registry.py +23 -0
- aiecs/core/__init__.py +46 -0
- aiecs/core/interface/__init__.py +34 -0
- aiecs/core/interface/execution_interface.py +152 -0
- aiecs/core/interface/storage_interface.py +171 -0
- aiecs/domain/__init__.py +289 -0
- aiecs/domain/agent/__init__.py +189 -0
- aiecs/domain/agent/base_agent.py +697 -0
- aiecs/domain/agent/exceptions.py +103 -0
- aiecs/domain/agent/graph_aware_mixin.py +559 -0
- aiecs/domain/agent/hybrid_agent.py +490 -0
- aiecs/domain/agent/integration/__init__.py +26 -0
- aiecs/domain/agent/integration/context_compressor.py +222 -0
- aiecs/domain/agent/integration/context_engine_adapter.py +252 -0
- aiecs/domain/agent/integration/retry_policy.py +219 -0
- aiecs/domain/agent/integration/role_config.py +213 -0
- aiecs/domain/agent/knowledge_aware_agent.py +646 -0
- aiecs/domain/agent/lifecycle.py +296 -0
- aiecs/domain/agent/llm_agent.py +300 -0
- aiecs/domain/agent/memory/__init__.py +12 -0
- aiecs/domain/agent/memory/conversation.py +197 -0
- aiecs/domain/agent/migration/__init__.py +14 -0
- aiecs/domain/agent/migration/conversion.py +160 -0
- aiecs/domain/agent/migration/legacy_wrapper.py +90 -0
- aiecs/domain/agent/models.py +317 -0
- aiecs/domain/agent/observability.py +407 -0
- aiecs/domain/agent/persistence.py +289 -0
- aiecs/domain/agent/prompts/__init__.py +29 -0
- aiecs/domain/agent/prompts/builder.py +161 -0
- aiecs/domain/agent/prompts/formatters.py +189 -0
- aiecs/domain/agent/prompts/template.py +255 -0
- aiecs/domain/agent/registry.py +260 -0
- aiecs/domain/agent/tool_agent.py +257 -0
- aiecs/domain/agent/tools/__init__.py +12 -0
- aiecs/domain/agent/tools/schema_generator.py +221 -0
- aiecs/domain/community/__init__.py +155 -0
- aiecs/domain/community/agent_adapter.py +477 -0
- aiecs/domain/community/analytics.py +481 -0
- aiecs/domain/community/collaborative_workflow.py +642 -0
- aiecs/domain/community/communication_hub.py +645 -0
- aiecs/domain/community/community_builder.py +320 -0
- aiecs/domain/community/community_integration.py +800 -0
- aiecs/domain/community/community_manager.py +813 -0
- aiecs/domain/community/decision_engine.py +879 -0
- aiecs/domain/community/exceptions.py +225 -0
- aiecs/domain/community/models/__init__.py +33 -0
- aiecs/domain/community/models/community_models.py +268 -0
- aiecs/domain/community/resource_manager.py +457 -0
- aiecs/domain/community/shared_context_manager.py +603 -0
- aiecs/domain/context/__init__.py +58 -0
- aiecs/domain/context/context_engine.py +989 -0
- aiecs/domain/context/conversation_models.py +354 -0
- aiecs/domain/context/graph_memory.py +467 -0
- aiecs/domain/execution/__init__.py +12 -0
- aiecs/domain/execution/model.py +57 -0
- aiecs/domain/knowledge_graph/__init__.py +19 -0
- aiecs/domain/knowledge_graph/models/__init__.py +52 -0
- aiecs/domain/knowledge_graph/models/entity.py +130 -0
- aiecs/domain/knowledge_graph/models/evidence.py +194 -0
- aiecs/domain/knowledge_graph/models/inference_rule.py +186 -0
- aiecs/domain/knowledge_graph/models/path.py +179 -0
- aiecs/domain/knowledge_graph/models/path_pattern.py +173 -0
- aiecs/domain/knowledge_graph/models/query.py +272 -0
- aiecs/domain/knowledge_graph/models/query_plan.py +187 -0
- aiecs/domain/knowledge_graph/models/relation.py +136 -0
- aiecs/domain/knowledge_graph/schema/__init__.py +23 -0
- aiecs/domain/knowledge_graph/schema/entity_type.py +135 -0
- aiecs/domain/knowledge_graph/schema/graph_schema.py +271 -0
- aiecs/domain/knowledge_graph/schema/property_schema.py +155 -0
- aiecs/domain/knowledge_graph/schema/relation_type.py +171 -0
- aiecs/domain/knowledge_graph/schema/schema_manager.py +496 -0
- aiecs/domain/knowledge_graph/schema/type_enums.py +205 -0
- aiecs/domain/task/__init__.py +13 -0
- aiecs/domain/task/dsl_processor.py +613 -0
- aiecs/domain/task/model.py +62 -0
- aiecs/domain/task/task_context.py +268 -0
- aiecs/infrastructure/__init__.py +24 -0
- aiecs/infrastructure/graph_storage/__init__.py +11 -0
- aiecs/infrastructure/graph_storage/base.py +601 -0
- aiecs/infrastructure/graph_storage/batch_operations.py +449 -0
- aiecs/infrastructure/graph_storage/cache.py +429 -0
- aiecs/infrastructure/graph_storage/distributed.py +226 -0
- aiecs/infrastructure/graph_storage/error_handling.py +390 -0
- aiecs/infrastructure/graph_storage/graceful_degradation.py +306 -0
- aiecs/infrastructure/graph_storage/health_checks.py +378 -0
- aiecs/infrastructure/graph_storage/in_memory.py +514 -0
- aiecs/infrastructure/graph_storage/index_optimization.py +483 -0
- aiecs/infrastructure/graph_storage/lazy_loading.py +410 -0
- aiecs/infrastructure/graph_storage/metrics.py +357 -0
- aiecs/infrastructure/graph_storage/migration.py +413 -0
- aiecs/infrastructure/graph_storage/pagination.py +471 -0
- aiecs/infrastructure/graph_storage/performance_monitoring.py +466 -0
- aiecs/infrastructure/graph_storage/postgres.py +871 -0
- aiecs/infrastructure/graph_storage/query_optimizer.py +635 -0
- aiecs/infrastructure/graph_storage/schema_cache.py +290 -0
- aiecs/infrastructure/graph_storage/sqlite.py +623 -0
- aiecs/infrastructure/graph_storage/streaming.py +495 -0
- aiecs/infrastructure/messaging/__init__.py +13 -0
- aiecs/infrastructure/messaging/celery_task_manager.py +383 -0
- aiecs/infrastructure/messaging/websocket_manager.py +298 -0
- aiecs/infrastructure/monitoring/__init__.py +34 -0
- aiecs/infrastructure/monitoring/executor_metrics.py +174 -0
- aiecs/infrastructure/monitoring/global_metrics_manager.py +213 -0
- aiecs/infrastructure/monitoring/structured_logger.py +48 -0
- aiecs/infrastructure/monitoring/tracing_manager.py +410 -0
- aiecs/infrastructure/persistence/__init__.py +24 -0
- aiecs/infrastructure/persistence/context_engine_client.py +187 -0
- aiecs/infrastructure/persistence/database_manager.py +333 -0
- aiecs/infrastructure/persistence/file_storage.py +754 -0
- aiecs/infrastructure/persistence/redis_client.py +220 -0
- aiecs/llm/__init__.py +86 -0
- aiecs/llm/callbacks/__init__.py +11 -0
- aiecs/llm/callbacks/custom_callbacks.py +264 -0
- aiecs/llm/client_factory.py +420 -0
- aiecs/llm/clients/__init__.py +33 -0
- aiecs/llm/clients/base_client.py +193 -0
- aiecs/llm/clients/googleai_client.py +181 -0
- aiecs/llm/clients/openai_client.py +131 -0
- aiecs/llm/clients/vertex_client.py +437 -0
- aiecs/llm/clients/xai_client.py +184 -0
- aiecs/llm/config/__init__.py +51 -0
- aiecs/llm/config/config_loader.py +275 -0
- aiecs/llm/config/config_validator.py +236 -0
- aiecs/llm/config/model_config.py +151 -0
- aiecs/llm/utils/__init__.py +10 -0
- aiecs/llm/utils/validate_config.py +91 -0
- aiecs/main.py +363 -0
- aiecs/scripts/__init__.py +3 -0
- aiecs/scripts/aid/VERSION_MANAGEMENT.md +97 -0
- aiecs/scripts/aid/__init__.py +19 -0
- aiecs/scripts/aid/version_manager.py +215 -0
- aiecs/scripts/dependance_check/DEPENDENCY_SYSTEM_SUMMARY.md +242 -0
- aiecs/scripts/dependance_check/README_DEPENDENCY_CHECKER.md +310 -0
- aiecs/scripts/dependance_check/__init__.py +17 -0
- aiecs/scripts/dependance_check/dependency_checker.py +938 -0
- aiecs/scripts/dependance_check/dependency_fixer.py +391 -0
- aiecs/scripts/dependance_check/download_nlp_data.py +396 -0
- aiecs/scripts/dependance_check/quick_dependency_check.py +270 -0
- aiecs/scripts/dependance_check/setup_nlp_data.sh +217 -0
- aiecs/scripts/dependance_patch/__init__.py +7 -0
- aiecs/scripts/dependance_patch/fix_weasel/README_WEASEL_PATCH.md +126 -0
- aiecs/scripts/dependance_patch/fix_weasel/__init__.py +11 -0
- aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.py +128 -0
- aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.sh +82 -0
- aiecs/scripts/dependance_patch/fix_weasel/patch_weasel_library.sh +188 -0
- aiecs/scripts/dependance_patch/fix_weasel/run_weasel_patch.sh +41 -0
- aiecs/scripts/tools_develop/README.md +449 -0
- aiecs/scripts/tools_develop/TOOL_AUTO_DISCOVERY.md +234 -0
- aiecs/scripts/tools_develop/__init__.py +21 -0
- aiecs/scripts/tools_develop/check_type_annotations.py +259 -0
- aiecs/scripts/tools_develop/validate_tool_schemas.py +422 -0
- aiecs/scripts/tools_develop/verify_tools.py +356 -0
- aiecs/tasks/__init__.py +1 -0
- aiecs/tasks/worker.py +172 -0
- aiecs/tools/__init__.py +299 -0
- aiecs/tools/apisource/__init__.py +99 -0
- aiecs/tools/apisource/intelligence/__init__.py +19 -0
- aiecs/tools/apisource/intelligence/data_fusion.py +381 -0
- aiecs/tools/apisource/intelligence/query_analyzer.py +413 -0
- aiecs/tools/apisource/intelligence/search_enhancer.py +388 -0
- aiecs/tools/apisource/monitoring/__init__.py +9 -0
- aiecs/tools/apisource/monitoring/metrics.py +303 -0
- aiecs/tools/apisource/providers/__init__.py +115 -0
- aiecs/tools/apisource/providers/base.py +664 -0
- aiecs/tools/apisource/providers/census.py +401 -0
- aiecs/tools/apisource/providers/fred.py +564 -0
- aiecs/tools/apisource/providers/newsapi.py +412 -0
- aiecs/tools/apisource/providers/worldbank.py +357 -0
- aiecs/tools/apisource/reliability/__init__.py +12 -0
- aiecs/tools/apisource/reliability/error_handler.py +375 -0
- aiecs/tools/apisource/reliability/fallback_strategy.py +391 -0
- aiecs/tools/apisource/tool.py +850 -0
- aiecs/tools/apisource/utils/__init__.py +9 -0
- aiecs/tools/apisource/utils/validators.py +338 -0
- aiecs/tools/base_tool.py +201 -0
- aiecs/tools/docs/__init__.py +121 -0
- aiecs/tools/docs/ai_document_orchestrator.py +599 -0
- aiecs/tools/docs/ai_document_writer_orchestrator.py +2403 -0
- aiecs/tools/docs/content_insertion_tool.py +1333 -0
- aiecs/tools/docs/document_creator_tool.py +1317 -0
- aiecs/tools/docs/document_layout_tool.py +1166 -0
- aiecs/tools/docs/document_parser_tool.py +994 -0
- aiecs/tools/docs/document_writer_tool.py +1818 -0
- aiecs/tools/knowledge_graph/__init__.py +17 -0
- aiecs/tools/knowledge_graph/graph_reasoning_tool.py +734 -0
- aiecs/tools/knowledge_graph/graph_search_tool.py +923 -0
- aiecs/tools/knowledge_graph/kg_builder_tool.py +476 -0
- aiecs/tools/langchain_adapter.py +542 -0
- aiecs/tools/schema_generator.py +275 -0
- aiecs/tools/search_tool/__init__.py +100 -0
- aiecs/tools/search_tool/analyzers.py +589 -0
- aiecs/tools/search_tool/cache.py +260 -0
- aiecs/tools/search_tool/constants.py +128 -0
- aiecs/tools/search_tool/context.py +216 -0
- aiecs/tools/search_tool/core.py +749 -0
- aiecs/tools/search_tool/deduplicator.py +123 -0
- aiecs/tools/search_tool/error_handler.py +271 -0
- aiecs/tools/search_tool/metrics.py +371 -0
- aiecs/tools/search_tool/rate_limiter.py +178 -0
- aiecs/tools/search_tool/schemas.py +277 -0
- aiecs/tools/statistics/__init__.py +80 -0
- aiecs/tools/statistics/ai_data_analysis_orchestrator.py +643 -0
- aiecs/tools/statistics/ai_insight_generator_tool.py +505 -0
- aiecs/tools/statistics/ai_report_orchestrator_tool.py +694 -0
- aiecs/tools/statistics/data_loader_tool.py +564 -0
- aiecs/tools/statistics/data_profiler_tool.py +658 -0
- aiecs/tools/statistics/data_transformer_tool.py +573 -0
- aiecs/tools/statistics/data_visualizer_tool.py +495 -0
- aiecs/tools/statistics/model_trainer_tool.py +487 -0
- aiecs/tools/statistics/statistical_analyzer_tool.py +459 -0
- aiecs/tools/task_tools/__init__.py +86 -0
- aiecs/tools/task_tools/chart_tool.py +732 -0
- aiecs/tools/task_tools/classfire_tool.py +922 -0
- aiecs/tools/task_tools/image_tool.py +447 -0
- aiecs/tools/task_tools/office_tool.py +684 -0
- aiecs/tools/task_tools/pandas_tool.py +635 -0
- aiecs/tools/task_tools/report_tool.py +635 -0
- aiecs/tools/task_tools/research_tool.py +392 -0
- aiecs/tools/task_tools/scraper_tool.py +715 -0
- aiecs/tools/task_tools/stats_tool.py +688 -0
- aiecs/tools/temp_file_manager.py +130 -0
- aiecs/tools/tool_executor/__init__.py +37 -0
- aiecs/tools/tool_executor/tool_executor.py +881 -0
- aiecs/utils/LLM_output_structor.py +445 -0
- aiecs/utils/__init__.py +34 -0
- aiecs/utils/base_callback.py +47 -0
- aiecs/utils/cache_provider.py +695 -0
- aiecs/utils/execution_utils.py +184 -0
- aiecs/utils/logging.py +1 -0
- aiecs/utils/prompt_loader.py +14 -0
- aiecs/utils/token_usage_repository.py +323 -0
- aiecs/ws/__init__.py +0 -0
- aiecs/ws/socket_server.py +52 -0
- aiecs-1.5.1.dist-info/METADATA +608 -0
- aiecs-1.5.1.dist-info/RECORD +302 -0
- aiecs-1.5.1.dist-info/WHEEL +5 -0
- aiecs-1.5.1.dist-info/entry_points.txt +10 -0
- aiecs-1.5.1.dist-info/licenses/LICENSE +225 -0
- aiecs-1.5.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,467 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Graph Memory Integration for ContextEngine
|
|
3
|
+
|
|
4
|
+
Extends ContextEngine with knowledge graph memory capabilities,
|
|
5
|
+
allowing agents to store and retrieve knowledge from the graph
|
|
6
|
+
during conversations.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import logging
|
|
10
|
+
from typing import Dict, Any, Optional, List
|
|
11
|
+
from datetime import datetime
|
|
12
|
+
|
|
13
|
+
from aiecs.infrastructure.graph_storage.base import GraphStore
|
|
14
|
+
from aiecs.domain.knowledge_graph.models.entity import Entity
|
|
15
|
+
from aiecs.domain.knowledge_graph.models.relation import Relation
|
|
16
|
+
|
|
17
|
+
logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class GraphMemoryMixin:
|
|
21
|
+
"""
|
|
22
|
+
Mixin to add graph memory capabilities to ContextEngine.
|
|
23
|
+
|
|
24
|
+
This mixin extends ContextEngine with methods to:
|
|
25
|
+
- Store knowledge entities and relations
|
|
26
|
+
- Retrieve knowledge based on context
|
|
27
|
+
- Link conversation to knowledge graph
|
|
28
|
+
- Maintain graph-based conversation context
|
|
29
|
+
|
|
30
|
+
Usage:
|
|
31
|
+
class ContextEngineWithGraph(ContextEngine, GraphMemoryMixin):
|
|
32
|
+
def __init__(self, graph_store: GraphStore, ...):
|
|
33
|
+
super().__init__(...)
|
|
34
|
+
self.graph_store = graph_store
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
# Note: This assumes the class has self.graph_store: Optional[GraphStore]
|
|
38
|
+
|
|
39
|
+
async def store_knowledge(
|
|
40
|
+
self,
|
|
41
|
+
session_id: str,
|
|
42
|
+
entity: Entity,
|
|
43
|
+
relations: Optional[List[Relation]] = None,
|
|
44
|
+
link_to_session: bool = True,
|
|
45
|
+
) -> bool:
|
|
46
|
+
"""
|
|
47
|
+
Store knowledge entity (and optional relations) to the graph.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
session_id: Session identifier
|
|
51
|
+
entity: Entity to store
|
|
52
|
+
relations: Optional list of relations involving this entity
|
|
53
|
+
link_to_session: Whether to create a relation linking entity to session
|
|
54
|
+
|
|
55
|
+
Returns:
|
|
56
|
+
True if stored successfully, False otherwise
|
|
57
|
+
|
|
58
|
+
Example:
|
|
59
|
+
# Store a new person entity from conversation
|
|
60
|
+
person = Entity(
|
|
61
|
+
id="person_123",
|
|
62
|
+
entity_type="Person",
|
|
63
|
+
properties={"name": "Alice", "role": "Engineer"}
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
await context_engine.store_knowledge(
|
|
67
|
+
session_id="session_1",
|
|
68
|
+
entity=person,
|
|
69
|
+
link_to_session=True
|
|
70
|
+
)
|
|
71
|
+
"""
|
|
72
|
+
if not hasattr(self, "graph_store") or self.graph_store is None:
|
|
73
|
+
logger.warning("GraphStore not available, cannot store knowledge")
|
|
74
|
+
return False
|
|
75
|
+
|
|
76
|
+
try:
|
|
77
|
+
# Store entity
|
|
78
|
+
await self.graph_store.add_entity(entity)
|
|
79
|
+
logger.debug(f"Stored entity {entity.id} to graph")
|
|
80
|
+
|
|
81
|
+
# Store relations if provided
|
|
82
|
+
if relations:
|
|
83
|
+
for relation in relations:
|
|
84
|
+
await self.graph_store.add_relation(relation)
|
|
85
|
+
logger.debug(f"Stored {len(relations)} relations to graph")
|
|
86
|
+
|
|
87
|
+
# Link entity to session if requested
|
|
88
|
+
if link_to_session:
|
|
89
|
+
session_entity_id = f"session_{session_id}"
|
|
90
|
+
|
|
91
|
+
# Create session entity if it doesn't exist
|
|
92
|
+
session_entity = await self.graph_store.get_entity(session_entity_id)
|
|
93
|
+
if not session_entity:
|
|
94
|
+
session_entity = Entity(
|
|
95
|
+
id=session_entity_id,
|
|
96
|
+
entity_type="Session",
|
|
97
|
+
properties={
|
|
98
|
+
"session_id": session_id,
|
|
99
|
+
"created_at": datetime.utcnow().isoformat(),
|
|
100
|
+
},
|
|
101
|
+
)
|
|
102
|
+
await self.graph_store.add_entity(session_entity)
|
|
103
|
+
|
|
104
|
+
# Create MENTIONED_IN relation
|
|
105
|
+
relation = Relation(
|
|
106
|
+
id=f"mention_{entity.id}_{session_id}_{datetime.utcnow().timestamp()}",
|
|
107
|
+
source_id=entity.id,
|
|
108
|
+
target_id=session_entity_id,
|
|
109
|
+
relation_type="MENTIONED_IN",
|
|
110
|
+
properties={"timestamp": datetime.utcnow().isoformat()},
|
|
111
|
+
)
|
|
112
|
+
await self.graph_store.add_relation(relation)
|
|
113
|
+
logger.debug(f"Linked entity {entity.id} to session {session_id}")
|
|
114
|
+
|
|
115
|
+
return True
|
|
116
|
+
|
|
117
|
+
except Exception as e:
|
|
118
|
+
logger.error(f"Failed to store knowledge: {e}")
|
|
119
|
+
return False
|
|
120
|
+
|
|
121
|
+
async def retrieve_knowledge(
|
|
122
|
+
self,
|
|
123
|
+
session_id: str,
|
|
124
|
+
query: Optional[str] = None,
|
|
125
|
+
entity_types: Optional[List[str]] = None,
|
|
126
|
+
limit: int = 10,
|
|
127
|
+
include_session_context: bool = True,
|
|
128
|
+
) -> List[Entity]:
|
|
129
|
+
"""
|
|
130
|
+
Retrieve knowledge entities relevant to the session and/or query.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
session_id: Session identifier
|
|
134
|
+
query: Optional search query (uses embedding if available)
|
|
135
|
+
entity_types: Optional filter by entity types
|
|
136
|
+
limit: Maximum number of entities to retrieve
|
|
137
|
+
include_session_context: Whether to include entities mentioned in this session
|
|
138
|
+
|
|
139
|
+
Returns:
|
|
140
|
+
List of relevant entities
|
|
141
|
+
|
|
142
|
+
Example:
|
|
143
|
+
# Retrieve people mentioned in this session
|
|
144
|
+
people = await context_engine.retrieve_knowledge(
|
|
145
|
+
session_id="session_1",
|
|
146
|
+
entity_types=["Person"],
|
|
147
|
+
limit=5
|
|
148
|
+
)
|
|
149
|
+
"""
|
|
150
|
+
if not hasattr(self, "graph_store") or self.graph_store is None:
|
|
151
|
+
logger.warning("GraphStore not available, cannot retrieve knowledge")
|
|
152
|
+
return []
|
|
153
|
+
|
|
154
|
+
try:
|
|
155
|
+
entities = []
|
|
156
|
+
|
|
157
|
+
# 1. Get session-specific entities if requested
|
|
158
|
+
if include_session_context:
|
|
159
|
+
session_entities = await self._get_session_entities(session_id)
|
|
160
|
+
entities.extend(session_entities[:limit])
|
|
161
|
+
|
|
162
|
+
# 2. If query provided, use vector search (if available)
|
|
163
|
+
if query and len(entities) < limit:
|
|
164
|
+
# Note: This assumes entities have embeddings
|
|
165
|
+
# In a real implementation, you'd generate query embedding
|
|
166
|
+
try:
|
|
167
|
+
from aiecs.infrastructure.graph_storage.in_memory import (
|
|
168
|
+
InMemoryGraphStore,
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
if isinstance(self.graph_store, InMemoryGraphStore):
|
|
172
|
+
# For now, just use basic search
|
|
173
|
+
# TODO: Implement embedding-based search
|
|
174
|
+
pass
|
|
175
|
+
except ImportError:
|
|
176
|
+
pass
|
|
177
|
+
|
|
178
|
+
# 3. Filter by entity types if specified
|
|
179
|
+
if entity_types:
|
|
180
|
+
entities = [e for e in entities if e.entity_type in entity_types]
|
|
181
|
+
|
|
182
|
+
# Remove duplicates
|
|
183
|
+
seen = set()
|
|
184
|
+
unique_entities = []
|
|
185
|
+
for entity in entities:
|
|
186
|
+
if entity.id not in seen:
|
|
187
|
+
seen.add(entity.id)
|
|
188
|
+
unique_entities.append(entity)
|
|
189
|
+
|
|
190
|
+
return unique_entities[:limit]
|
|
191
|
+
|
|
192
|
+
except Exception as e:
|
|
193
|
+
logger.error(f"Failed to retrieve knowledge: {e}")
|
|
194
|
+
return []
|
|
195
|
+
|
|
196
|
+
async def _get_session_entities(self, session_id: str) -> List[Entity]:
|
|
197
|
+
"""Get all entities mentioned in this session."""
|
|
198
|
+
try:
|
|
199
|
+
session_entity_id = f"session_{session_id}"
|
|
200
|
+
|
|
201
|
+
# Get session entity
|
|
202
|
+
session_entity = await self.graph_store.get_entity(session_entity_id)
|
|
203
|
+
if not session_entity:
|
|
204
|
+
return []
|
|
205
|
+
|
|
206
|
+
# Get all entities with MENTIONED_IN relation to this session
|
|
207
|
+
# Note: We need to traverse backwards from session to entities
|
|
208
|
+
# get_neighbors only accepts single relation_type, not a list
|
|
209
|
+
# neighbors = await self.graph_store.get_neighbors(
|
|
210
|
+
# session_entity_id,
|
|
211
|
+
# relation_type="MENTIONED_IN",
|
|
212
|
+
# direction="incoming" # Get entities that point TO the session
|
|
213
|
+
# ) # Reserved for future use
|
|
214
|
+
|
|
215
|
+
# Neighbors are entities that have MENTIONED_IN relation to session
|
|
216
|
+
# We need to get entities that point TO the session
|
|
217
|
+
# This requires iterating through all entities (not ideal, but
|
|
218
|
+
# functional)
|
|
219
|
+
|
|
220
|
+
# For now, return empty - proper implementation would require
|
|
221
|
+
# inverse index or traversal from session
|
|
222
|
+
# This is a simplified implementation
|
|
223
|
+
return []
|
|
224
|
+
|
|
225
|
+
except Exception as e:
|
|
226
|
+
logger.error(f"Failed to get session entities: {e}")
|
|
227
|
+
return []
|
|
228
|
+
|
|
229
|
+
async def add_graph_conversation_context(
|
|
230
|
+
self,
|
|
231
|
+
session_id: str,
|
|
232
|
+
entity_ids: List[str],
|
|
233
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
234
|
+
) -> bool:
|
|
235
|
+
"""
|
|
236
|
+
Add graph-based context to conversation.
|
|
237
|
+
|
|
238
|
+
Links specific entities to the current conversation session,
|
|
239
|
+
providing additional context for the agent.
|
|
240
|
+
|
|
241
|
+
Args:
|
|
242
|
+
session_id: Session identifier
|
|
243
|
+
entity_ids: List of entity IDs to link to session
|
|
244
|
+
metadata: Optional metadata about the context
|
|
245
|
+
|
|
246
|
+
Returns:
|
|
247
|
+
True if successful, False otherwise
|
|
248
|
+
|
|
249
|
+
Example:
|
|
250
|
+
# Add context entities to conversation
|
|
251
|
+
await context_engine.add_graph_conversation_context(
|
|
252
|
+
session_id="session_1",
|
|
253
|
+
entity_ids=["person_alice", "company_techcorp"],
|
|
254
|
+
metadata={"context_type": "background_knowledge"}
|
|
255
|
+
)
|
|
256
|
+
"""
|
|
257
|
+
if not hasattr(self, "graph_store") or self.graph_store is None:
|
|
258
|
+
logger.warning("GraphStore not available, cannot add graph context")
|
|
259
|
+
return False
|
|
260
|
+
|
|
261
|
+
try:
|
|
262
|
+
session_entity_id = f"session_{session_id}"
|
|
263
|
+
|
|
264
|
+
# Ensure session entity exists
|
|
265
|
+
session_entity = await self.graph_store.get_entity(session_entity_id)
|
|
266
|
+
if not session_entity:
|
|
267
|
+
session_entity = Entity(
|
|
268
|
+
id=session_entity_id,
|
|
269
|
+
entity_type="Session",
|
|
270
|
+
properties={
|
|
271
|
+
"session_id": session_id,
|
|
272
|
+
"created_at": datetime.utcnow().isoformat(),
|
|
273
|
+
},
|
|
274
|
+
)
|
|
275
|
+
await self.graph_store.add_entity(session_entity)
|
|
276
|
+
|
|
277
|
+
# Link each entity to session
|
|
278
|
+
for entity_id in entity_ids:
|
|
279
|
+
# Verify entity exists
|
|
280
|
+
entity = await self.graph_store.get_entity(entity_id)
|
|
281
|
+
if not entity:
|
|
282
|
+
logger.warning(f"Entity {entity_id} not found, skipping")
|
|
283
|
+
continue
|
|
284
|
+
|
|
285
|
+
# Create CONTEXT_FOR relation
|
|
286
|
+
relation = Relation(
|
|
287
|
+
id=f"context_{entity_id}_{session_id}_{datetime.utcnow().timestamp()}",
|
|
288
|
+
source_id=entity_id,
|
|
289
|
+
target_id=session_entity_id,
|
|
290
|
+
relation_type="CONTEXT_FOR",
|
|
291
|
+
properties={
|
|
292
|
+
"timestamp": datetime.utcnow().isoformat(),
|
|
293
|
+
"metadata": metadata or {},
|
|
294
|
+
},
|
|
295
|
+
)
|
|
296
|
+
await self.graph_store.add_relation(relation)
|
|
297
|
+
|
|
298
|
+
logger.info(f"Added {len(entity_ids)} entities as context for session {session_id}")
|
|
299
|
+
return True
|
|
300
|
+
|
|
301
|
+
except Exception as e:
|
|
302
|
+
logger.error(f"Failed to add graph conversation context: {e}")
|
|
303
|
+
return False
|
|
304
|
+
|
|
305
|
+
async def get_session_knowledge_graph(
|
|
306
|
+
self, session_id: str, max_depth: int = 2
|
|
307
|
+
) -> Dict[str, Any]:
|
|
308
|
+
"""
|
|
309
|
+
Get a subgraph of knowledge relevant to this session.
|
|
310
|
+
|
|
311
|
+
Returns entities and relations mentioned or used as context
|
|
312
|
+
in this session, up to a specified depth.
|
|
313
|
+
|
|
314
|
+
Args:
|
|
315
|
+
session_id: Session identifier
|
|
316
|
+
max_depth: Maximum depth for graph traversal
|
|
317
|
+
|
|
318
|
+
Returns:
|
|
319
|
+
Dictionary with 'entities' and 'relations' lists
|
|
320
|
+
|
|
321
|
+
Example:
|
|
322
|
+
# Get knowledge graph for session
|
|
323
|
+
subgraph = await context_engine.get_session_knowledge_graph(
|
|
324
|
+
session_id="session_1",
|
|
325
|
+
max_depth=2
|
|
326
|
+
)
|
|
327
|
+
print(f"Entities: {len(subgraph['entities'])}")
|
|
328
|
+
print(f"Relations: {len(subgraph['relations'])}")
|
|
329
|
+
"""
|
|
330
|
+
if not hasattr(self, "graph_store") or self.graph_store is None:
|
|
331
|
+
logger.warning("GraphStore not available")
|
|
332
|
+
return {"entities": [], "relations": []}
|
|
333
|
+
|
|
334
|
+
try:
|
|
335
|
+
session_entity_id = f"session_{session_id}"
|
|
336
|
+
|
|
337
|
+
# Get session entity
|
|
338
|
+
session_entity = await self.graph_store.get_entity(session_entity_id)
|
|
339
|
+
if not session_entity:
|
|
340
|
+
return {"entities": [], "relations": []}
|
|
341
|
+
|
|
342
|
+
entities = [session_entity]
|
|
343
|
+
relations = []
|
|
344
|
+
visited = {session_entity_id}
|
|
345
|
+
|
|
346
|
+
# Traverse from session entity
|
|
347
|
+
current_level = [session_entity_id]
|
|
348
|
+
|
|
349
|
+
for depth in range(max_depth):
|
|
350
|
+
next_level = []
|
|
351
|
+
|
|
352
|
+
for entity_id in current_level:
|
|
353
|
+
# Get neighbors (check both relation types separately)
|
|
354
|
+
neighbors_mentioned = await self.graph_store.get_neighbors(
|
|
355
|
+
entity_id,
|
|
356
|
+
relation_type="MENTIONED_IN",
|
|
357
|
+
direction="both",
|
|
358
|
+
)
|
|
359
|
+
neighbors_context = await self.graph_store.get_neighbors(
|
|
360
|
+
entity_id,
|
|
361
|
+
relation_type="CONTEXT_FOR",
|
|
362
|
+
direction="both",
|
|
363
|
+
)
|
|
364
|
+
# Combine and deduplicate
|
|
365
|
+
neighbors = list(
|
|
366
|
+
{n.id: n for n in neighbors_mentioned + neighbors_context}.values()
|
|
367
|
+
)
|
|
368
|
+
|
|
369
|
+
for neighbor in neighbors:
|
|
370
|
+
if neighbor.id not in visited:
|
|
371
|
+
visited.add(neighbor.id)
|
|
372
|
+
entities.append(neighbor)
|
|
373
|
+
next_level.append(neighbor.id)
|
|
374
|
+
|
|
375
|
+
# Note: In a complete implementation, we'd also collect
|
|
376
|
+
# the relations between entities here
|
|
377
|
+
|
|
378
|
+
current_level = next_level
|
|
379
|
+
if not current_level:
|
|
380
|
+
break
|
|
381
|
+
|
|
382
|
+
return {
|
|
383
|
+
"entities": [e.model_dump() for e in entities],
|
|
384
|
+
"relations": relations, # Would be populated in full implementation
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
except Exception as e:
|
|
388
|
+
logger.error(f"Failed to get session knowledge graph: {e}")
|
|
389
|
+
return {"entities": [], "relations": []}
|
|
390
|
+
|
|
391
|
+
async def clear_session_knowledge(self, session_id: str, remove_entities: bool = False) -> bool:
|
|
392
|
+
"""
|
|
393
|
+
Clear knowledge graph associations for a session.
|
|
394
|
+
|
|
395
|
+
Args:
|
|
396
|
+
session_id: Session identifier
|
|
397
|
+
remove_entities: If True, also remove the session entity itself
|
|
398
|
+
|
|
399
|
+
Returns:
|
|
400
|
+
True if successful, False otherwise
|
|
401
|
+
"""
|
|
402
|
+
if not hasattr(self, "graph_store") or self.graph_store is None:
|
|
403
|
+
logger.warning("GraphStore not available")
|
|
404
|
+
return False
|
|
405
|
+
|
|
406
|
+
try:
|
|
407
|
+
session_entity_id = f"session_{session_id}"
|
|
408
|
+
|
|
409
|
+
if remove_entities:
|
|
410
|
+
# Check if delete_entity method exists (SQLite has it, InMemory
|
|
411
|
+
# might not)
|
|
412
|
+
if hasattr(self.graph_store, "delete_entity"):
|
|
413
|
+
await self.graph_store.delete_entity(session_entity_id)
|
|
414
|
+
logger.info(f"Removed session entity {session_entity_id}")
|
|
415
|
+
else:
|
|
416
|
+
# For InMemoryGraphStore, we can't easily delete entities
|
|
417
|
+
# Just log a warning
|
|
418
|
+
logger.warning(
|
|
419
|
+
f"delete_entity not available for {type(self.graph_store).__name__}, "
|
|
420
|
+
f"session entity {session_entity_id} not removed"
|
|
421
|
+
)
|
|
422
|
+
|
|
423
|
+
return True
|
|
424
|
+
|
|
425
|
+
except Exception as e:
|
|
426
|
+
logger.error(f"Failed to clear session knowledge: {e}")
|
|
427
|
+
return False
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
class ContextEngineWithGraph(GraphMemoryMixin):
|
|
431
|
+
"""
|
|
432
|
+
ContextEngine extended with graph memory capabilities.
|
|
433
|
+
|
|
434
|
+
This class can be used as a standalone context engine with graph support,
|
|
435
|
+
or as a mixin to extend existing ContextEngine instances.
|
|
436
|
+
|
|
437
|
+
Example:
|
|
438
|
+
from aiecs.domain.context import ContextEngine
|
|
439
|
+
from aiecs.domain.context.graph_memory import ContextEngineWithGraph
|
|
440
|
+
from aiecs.infrastructure.graph_storage import InMemoryGraphStore
|
|
441
|
+
|
|
442
|
+
# Create graph store
|
|
443
|
+
graph_store = InMemoryGraphStore()
|
|
444
|
+
await graph_store.initialize()
|
|
445
|
+
|
|
446
|
+
# Create context engine with graph support
|
|
447
|
+
# Note: Actual usage would involve proper inheritance or composition
|
|
448
|
+
context_engine = ContextEngine()
|
|
449
|
+
context_engine.graph_store = graph_store
|
|
450
|
+
await context_engine.initialize()
|
|
451
|
+
|
|
452
|
+
# Now you can use graph memory methods
|
|
453
|
+
await context_engine.store_knowledge(session_id, entity)
|
|
454
|
+
"""
|
|
455
|
+
|
|
456
|
+
def __init__(self, graph_store: Optional[GraphStore] = None):
|
|
457
|
+
"""
|
|
458
|
+
Initialize with optional graph store.
|
|
459
|
+
|
|
460
|
+
Args:
|
|
461
|
+
graph_store: Optional knowledge graph store
|
|
462
|
+
"""
|
|
463
|
+
self.graph_store = graph_store
|
|
464
|
+
logger.info(
|
|
465
|
+
f"ContextEngineWithGraph initialized with graph_store="
|
|
466
|
+
f"{'enabled' if graph_store else 'disabled'}"
|
|
467
|
+
)
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
from typing import Any, Dict, Optional
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class TaskStatus(Enum):
|
|
6
|
+
PENDING = "pending"
|
|
7
|
+
RUNNING = "running"
|
|
8
|
+
COMPLETED = "completed"
|
|
9
|
+
CANCELLED = "cancelled"
|
|
10
|
+
TIMED_OUT = "timed_out"
|
|
11
|
+
FAILED = "failed"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class ErrorCode(Enum):
|
|
15
|
+
VALIDATION_ERROR = "E001"
|
|
16
|
+
TIMEOUT_ERROR = "E002"
|
|
17
|
+
EXECUTION_ERROR = "E003"
|
|
18
|
+
CANCELLED_ERROR = "E004"
|
|
19
|
+
RETRY_EXHAUSTED = "E005"
|
|
20
|
+
DATABASE_ERROR = "E006"
|
|
21
|
+
DSL_EVALUATION_ERROR = "E007"
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class TaskStepResult:
|
|
25
|
+
"""Task step result model"""
|
|
26
|
+
|
|
27
|
+
def __init__(
|
|
28
|
+
self,
|
|
29
|
+
step: str,
|
|
30
|
+
result: Any,
|
|
31
|
+
completed: bool = False,
|
|
32
|
+
message: str = "",
|
|
33
|
+
status: str = "pending",
|
|
34
|
+
error_code: Optional[str] = None,
|
|
35
|
+
error_message: Optional[str] = None,
|
|
36
|
+
):
|
|
37
|
+
self.step = step
|
|
38
|
+
self.result = result
|
|
39
|
+
self.completed = completed
|
|
40
|
+
self.message = message
|
|
41
|
+
self.status = status
|
|
42
|
+
self.error_code = error_code
|
|
43
|
+
self.error_message = error_message
|
|
44
|
+
|
|
45
|
+
def dict(self) -> Dict[str, Any]:
|
|
46
|
+
return {
|
|
47
|
+
"step": self.step,
|
|
48
|
+
"result": self.result,
|
|
49
|
+
"completed": self.completed,
|
|
50
|
+
"message": self.message,
|
|
51
|
+
"status": self.status,
|
|
52
|
+
"error_code": self.error_code,
|
|
53
|
+
"error_message": self.error_message,
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
def __repr__(self) -> str:
|
|
57
|
+
return f"TaskStepResult(step='{self.step}', status='{self.status}', completed={self.completed})"
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Knowledge Graph Domain Layer
|
|
3
|
+
|
|
4
|
+
This module contains the domain models and business logic for the knowledge graph capability.
|
|
5
|
+
It provides entity models, relation models, schema definitions, and graph query abstractions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from aiecs.domain.knowledge_graph.models.entity import Entity
|
|
9
|
+
from aiecs.domain.knowledge_graph.models.relation import Relation
|
|
10
|
+
from aiecs.domain.knowledge_graph.models.path import Path
|
|
11
|
+
from aiecs.domain.knowledge_graph.models.query import GraphQuery, GraphResult
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"Entity",
|
|
15
|
+
"Relation",
|
|
16
|
+
"Path",
|
|
17
|
+
"GraphQuery",
|
|
18
|
+
"GraphResult",
|
|
19
|
+
]
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Knowledge Graph Domain Models
|
|
3
|
+
|
|
4
|
+
Core domain models for knowledge graph entities, relations, and queries.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from aiecs.domain.knowledge_graph.models.entity import Entity
|
|
8
|
+
from aiecs.domain.knowledge_graph.models.relation import Relation
|
|
9
|
+
from aiecs.domain.knowledge_graph.models.path import Path
|
|
10
|
+
from aiecs.domain.knowledge_graph.models.path_pattern import (
|
|
11
|
+
PathPattern,
|
|
12
|
+
TraversalDirection,
|
|
13
|
+
)
|
|
14
|
+
from aiecs.domain.knowledge_graph.models.query import GraphQuery, GraphResult
|
|
15
|
+
from aiecs.domain.knowledge_graph.models.query_plan import (
|
|
16
|
+
QueryPlan,
|
|
17
|
+
QueryStep,
|
|
18
|
+
QueryOperation,
|
|
19
|
+
OptimizationStrategy,
|
|
20
|
+
)
|
|
21
|
+
from aiecs.domain.knowledge_graph.models.evidence import (
|
|
22
|
+
Evidence,
|
|
23
|
+
EvidenceType,
|
|
24
|
+
ReasoningResult,
|
|
25
|
+
)
|
|
26
|
+
from aiecs.domain.knowledge_graph.models.inference_rule import (
|
|
27
|
+
InferenceRule,
|
|
28
|
+
InferenceStep,
|
|
29
|
+
InferenceResult,
|
|
30
|
+
RuleType,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
__all__ = [
|
|
34
|
+
"Entity",
|
|
35
|
+
"Relation",
|
|
36
|
+
"Path",
|
|
37
|
+
"PathPattern",
|
|
38
|
+
"TraversalDirection",
|
|
39
|
+
"GraphQuery",
|
|
40
|
+
"GraphResult",
|
|
41
|
+
"QueryPlan",
|
|
42
|
+
"QueryStep",
|
|
43
|
+
"QueryOperation",
|
|
44
|
+
"OptimizationStrategy",
|
|
45
|
+
"Evidence",
|
|
46
|
+
"EvidenceType",
|
|
47
|
+
"ReasoningResult",
|
|
48
|
+
"InferenceRule",
|
|
49
|
+
"InferenceStep",
|
|
50
|
+
"InferenceResult",
|
|
51
|
+
"RuleType",
|
|
52
|
+
]
|