use crate::knowledge::{EntityId, StatementId};
use oxibrain_ports::Timestamp;
use serde::{Deserialize, Serialize};
pub use crate::rank::{DropReason, DroppedItem, RankedItem, RankingResult};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Query {
pub text: String,
pub mode: QueryMode,
pub space: String,
#[serde(default)]
pub as_of: Option<Timestamp>,
#[serde(default = "default_limit")]
pub limit: usize,
#[serde(default)]
pub min_confidence: f32,
}
fn default_limit() -> usize {
20
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum QueryMode {
Hybrid,
Lexical,
LexicalVector,
Dense,
Graph,
Community,
}
impl QueryMode {
pub fn to_preset(self) -> &'static str {
match self {
QueryMode::Hybrid => "hybrid",
QueryMode::Lexical => "lexical",
QueryMode::LexicalVector => "lexical", QueryMode::Dense => "semantic",
QueryMode::Graph => "graph",
QueryMode::Community => "community",
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SearchHit {
pub target: SearchTarget,
pub score: f64,
pub mode: QueryMode,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum SearchTarget {
Episode { id: String },
Statement { id: StatementId },
Entity { id: EntityId },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TraversalSpec {
pub start: Vec<EntityId>,
pub max_depth: u8,
pub max_nodes: u32,
pub predicates: PredicateFilter,
pub direction: Direction,
#[serde(default)]
pub valid_at: Option<Timestamp>,
pub min_confidence: f32,
pub strategy: Strategy,
}
impl Default for TraversalSpec {
fn default() -> Self {
Self {
start: Vec::new(),
max_depth: 3,
max_nodes: 256,
predicates: PredicateFilter::AllowAll,
direction: Direction::Both,
valid_at: None,
min_confidence: 0.0,
strategy: Strategy::Bfs,
}
}
}
pub use oxibrain_index::{Direction, PredicateFilter};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum Strategy {
Bfs,
ShortestPath { to: EntityId },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TraversalResult {
pub nodes: Vec<TraversalNode>,
pub edges: Vec<TraversalEdge>,
pub truncated: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TraversalNode {
pub entity: EntityId,
pub depth: u8,
pub salience: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TraversalEdge {
pub from: EntityId,
pub to: EntityId,
pub predicate: String,
pub statement_id: StatementId,
pub depth: u8,
}