Skip to main content

Session

Struct Session 

Source
pub struct Session { /* private fields */ }
Expand description

Your handle to the database - execute queries and manage transactions.

Get one from GrafeoDB::session(). Each session tracks its own transaction state, so you can have multiple concurrent sessions without them interfering.

Implementations§

Source§

impl Session

Source

pub fn execute(&self, query: &str) -> Result<QueryResult>

Executes a GQL query.

§Errors

Returns an error if the query fails to parse or execute.

§Examples
use grafeo_engine::GrafeoDB;

let db = GrafeoDB::new_in_memory();
let session = db.session();

// Create a node
session.execute("INSERT (:Person {name: 'Alice', age: 30})")?;

// Query nodes
let result = session.execute("MATCH (n:Person) RETURN n.name, n.age")?;
for row in result {
    println!("{:?}", row);
}
Source

pub fn execute_with_params( &self, query: &str, params: HashMap<String, Value>, ) -> Result<QueryResult>

Executes a GQL query with parameters.

§Errors

Returns an error if the query fails to parse or execute.

Source

pub fn begin_tx(&mut self) -> Result<()>

Begins a new transaction.

§Errors

Returns an error if a transaction is already active.

§Examples
use grafeo_engine::GrafeoDB;

let db = GrafeoDB::new_in_memory();
let mut session = db.session();

session.begin_tx()?;
session.execute("INSERT (:Person {name: 'Alice'})")?;
session.execute("INSERT (:Person {name: 'Bob'})")?;
session.commit()?; // Both inserts committed atomically
Source

pub fn commit(&mut self) -> Result<()>

Commits the current transaction.

Makes all changes since begin_tx permanent.

§Errors

Returns an error if no transaction is active.

Source

pub fn rollback(&mut self) -> Result<()>

Aborts the current transaction.

Discards all changes since begin_tx.

§Errors

Returns an error if no transaction is active.

§Examples
use grafeo_engine::GrafeoDB;

let db = GrafeoDB::new_in_memory();
let mut session = db.session();

session.begin_tx()?;
session.execute("INSERT (:Person {name: 'Alice'})")?;
session.rollback()?; // Insert is discarded
Source

pub fn in_transaction(&self) -> bool

Returns whether a transaction is active.

Source

pub fn set_auto_commit(&mut self, auto_commit: bool)

Sets auto-commit mode.

Source

pub fn auto_commit(&self) -> bool

Returns whether auto-commit is enabled.

Source

pub fn create_node(&self, labels: &[&str]) -> NodeId

Creates a node directly (bypassing query execution).

This is a low-level API for testing and direct manipulation. If a transaction is active, the node will be versioned with the transaction ID.

Source

pub fn create_node_with_props<'a>( &self, labels: &[&str], properties: impl IntoIterator<Item = (&'a str, Value)>, ) -> NodeId

Creates a node with properties.

If a transaction is active, the node will be versioned with the transaction ID.

Source

pub fn create_edge(&self, src: NodeId, dst: NodeId, edge_type: &str) -> EdgeId

Creates an edge between two nodes.

This is a low-level API for testing and direct manipulation. If a transaction is active, the edge will be versioned with the transaction ID.

Source

pub fn get_node(&self, id: NodeId) -> Option<Node>

Gets a node by ID directly, bypassing query planning.

This is the fastest way to retrieve a single node when you know its ID. Skips parsing, binding, optimization, and physical planning entirely.

§Performance
  • Time complexity: O(1) average case
  • No lock contention (uses DashMap internally)
  • ~20-30x faster than equivalent MATCH query
§Example
let session = db.session();
let node_id = session.create_node(&["Person"]);

// Direct lookup - O(1), no query planning
let node = session.get_node(node_id);
assert!(node.is_some());
Source

pub fn get_node_property(&self, id: NodeId, key: &str) -> Option<Value>

Gets a single property from a node by ID, bypassing query planning.

More efficient than get_node() when you only need one property, as it avoids loading the full node with all properties.

§Performance
  • Time complexity: O(1) average case
  • No query planning overhead
§Example
let session = db.session();
let id = session.create_node_with_props(&["Person"], [("name", "Alice".into())]);

// Direct property access - O(1)
let name = session.get_node_property(id, "name");
assert_eq!(name, Some(Value::String("Alice".into())));
Source

pub fn get_edge(&self, id: EdgeId) -> Option<Edge>

Gets an edge by ID directly, bypassing query planning.

§Performance
  • Time complexity: O(1) average case
  • No lock contention
Source

pub fn get_neighbors_outgoing(&self, node: NodeId) -> Vec<(NodeId, EdgeId)>

Gets outgoing neighbors of a node directly, bypassing query planning.

Returns (neighbor_id, edge_id) pairs for all outgoing edges.

§Performance
  • Time complexity: O(degree) where degree is the number of outgoing edges
  • Uses adjacency index for direct access
  • ~10-20x faster than equivalent MATCH query
§Example
let session = db.session();
let alice = session.create_node(&["Person"]);
let bob = session.create_node(&["Person"]);
session.create_edge(alice, bob, "KNOWS");

// Direct neighbor lookup - O(degree)
let neighbors = session.get_neighbors_outgoing(alice);
assert_eq!(neighbors.len(), 1);
assert_eq!(neighbors[0].0, bob);
Source

pub fn get_neighbors_incoming(&self, node: NodeId) -> Vec<(NodeId, EdgeId)>

Gets incoming neighbors of a node directly, bypassing query planning.

Returns (neighbor_id, edge_id) pairs for all incoming edges.

§Performance
  • Time complexity: O(degree) where degree is the number of incoming edges
  • Uses backward adjacency index for direct access
Source

pub fn get_neighbors_outgoing_by_type( &self, node: NodeId, edge_type: &str, ) -> Vec<(NodeId, EdgeId)>

Gets outgoing neighbors filtered by edge type, bypassing query planning.

§Example
let neighbors = session.get_neighbors_outgoing_by_type(alice, "KNOWS");
Source

pub fn node_exists(&self, id: NodeId) -> bool

Checks if a node exists, bypassing query planning.

§Performance
  • Time complexity: O(1)
  • Fastest existence check available
Source

pub fn edge_exists(&self, id: EdgeId) -> bool

Checks if an edge exists, bypassing query planning.

Source

pub fn get_degree(&self, node: NodeId) -> (usize, usize)

Gets the degree (number of edges) of a node.

Returns (outgoing_degree, incoming_degree).

Source

pub fn get_nodes_batch(&self, ids: &[NodeId]) -> Vec<Option<Node>>

Batch lookup of multiple nodes by ID.

More efficient than calling get_node() in a loop because it amortizes overhead.

§Performance
  • Time complexity: O(n) where n is the number of IDs
  • Better cache utilization than individual lookups

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more