use serde::{Deserialize, Serialize};
use utoipa::{IntoParams, ToSchema};
#[derive(Debug, Clone, Serialize, ToSchema)]
pub struct TraversalResultItem {
pub target_id: u64,
pub depth: u32,
pub path: Vec<u64>,
}
#[derive(Debug, Deserialize, IntoParams)]
pub struct EdgeQueryParams {
#[param(example = "KNOWS")]
pub label: Option<String>,
}
#[derive(Debug, Deserialize, ToSchema)]
pub struct TraverseRequest {
pub source: u64,
#[serde(default = "default_strategy")]
pub strategy: String,
#[serde(default = "default_max_depth")]
pub max_depth: u32,
#[serde(default = "default_limit")]
pub limit: usize,
pub cursor: Option<String>,
#[serde(default)]
pub rel_types: Vec<String>,
}
fn default_strategy() -> String {
"bfs".to_string()
}
fn default_max_depth() -> u32 {
3
}
fn default_limit() -> usize {
100
}
#[derive(Debug, Serialize, ToSchema)]
pub struct TraverseResponse {
pub results: Vec<TraversalResultItem>,
pub next_cursor: Option<String>,
pub has_more: bool,
pub stats: TraversalStats,
}
#[derive(Debug, Serialize, ToSchema)]
pub struct TraversalStats {
pub visited: usize,
pub depth_reached: u32,
}
#[derive(Debug, Serialize, ToSchema)]
pub struct DegreeResponse {
pub in_degree: usize,
pub out_degree: usize,
}
#[derive(Debug, Serialize, ToSchema)]
pub struct EdgesResponse {
pub edges: Vec<EdgeResponse>,
pub count: usize,
}
#[derive(Debug, Serialize, ToSchema)]
pub struct EdgeResponse {
pub id: u64,
pub source: u64,
pub target: u64,
pub label: String,
pub properties: serde_json::Value,
}
#[derive(Debug, Deserialize, ToSchema)]
pub struct AddEdgeRequest {
pub id: u64,
pub source: u64,
pub target: u64,
pub label: String,
#[serde(default)]
pub properties: serde_json::Value,
}
#[derive(Debug, Serialize, ToSchema)]
pub struct EdgeCountResponse {
pub count: usize,
}
#[derive(Debug, Deserialize, IntoParams)]
pub struct NodeEdgeQueryParams {
#[serde(default = "default_direction")]
#[param(example = "out")]
pub direction: String,
#[param(example = "KNOWS")]
pub label: Option<String>,
}
fn default_direction() -> String {
"out".to_string()
}
#[derive(Debug, Serialize, ToSchema)]
pub struct NodeListResponse {
pub node_ids: Vec<u64>,
pub count: usize,
}
#[derive(Debug, Deserialize, ToSchema)]
pub struct UpsertNodePayloadRequest {
pub payload: serde_json::Value,
}
#[derive(Debug, Serialize, ToSchema)]
pub struct NodePayloadResponse {
pub node_id: u64,
pub payload: Option<serde_json::Value>,
}
#[derive(Debug, Deserialize, ToSchema)]
pub struct ParallelTraverseRequest {
pub sources: Vec<u64>,
#[serde(default = "default_max_depth")]
pub max_depth: u32,
#[serde(default = "default_limit")]
pub limit: usize,
#[serde(default)]
pub rel_types: Vec<String>,
}
#[derive(Debug, Deserialize, ToSchema)]
pub struct GraphSearchRequest {
pub vector: Vec<f32>,
#[serde(default = "default_graph_search_k")]
pub top_k: usize,
}
fn default_graph_search_k() -> usize {
10
}
#[derive(Debug, Serialize, ToSchema)]
pub struct GraphSearchResponse {
pub results: Vec<GraphSearchResultItem>,
}
#[derive(Debug, Serialize, ToSchema)]
pub struct GraphSearchResultItem {
pub id: u64,
pub score: f32,
pub payload: Option<serde_json::Value>,
}
#[derive(Debug, Deserialize, IntoParams)]
pub struct StreamTraverseParams {
#[param(example = 123)]
pub start_node: u64,
#[serde(default = "default_algorithm")]
#[param(example = "bfs")]
pub algorithm: String,
#[serde(default = "default_stream_max_depth")]
#[param(example = 5)]
pub max_depth: u32,
#[serde(default = "default_stream_limit")]
#[param(example = 1000)]
pub limit: usize,
#[serde(default)]
#[param(example = "KNOWS,FOLLOWS")]
pub relationship_types: Option<String>,
}
fn default_algorithm() -> String {
"bfs".to_string()
}
fn default_stream_max_depth() -> u32 {
5
}
fn default_stream_limit() -> usize {
1000
}
#[derive(Debug, Serialize, ToSchema)]
pub struct StreamNodeEvent {
pub id: u64,
pub depth: u32,
pub path: Vec<u64>,
}
#[derive(Debug, Serialize, ToSchema)]
pub struct StreamStatsEvent {
pub nodes_visited: usize,
pub elapsed_ms: u64,
}
#[derive(Debug, Serialize, ToSchema)]
pub struct StreamDoneEvent {
pub total_nodes: usize,
pub max_depth_reached: u32,
pub elapsed_ms: u64,
}
#[derive(Debug, Serialize, ToSchema)]
pub struct StreamErrorEvent {
pub error: String,
}