use rocksgraph::{Graph, StoreError, TraversalBuilder, __};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let temp_dir = tempfile::tempdir()?;
let graph = Graph::open(temp_dir.path())?;
let mut tx = graph.begin();
tx.g().addV("person").property("id", 1i64).property("name", "marko").next()?;
tx.g().addV("person").property("id", 2i64).property("name", "vadas").next()?;
tx.g().addV("software").property("id", 3i64).property("name", "lop").next()?;
tx.g().addE("knows").from(1).to(2).property("weight", 0.5f64).property("note", "old friends").next()?;
tx.g().addE("created").from(1).to(3).property("weight", 0.4f64).next()?;
tx.commit()?;
println!("=== union() ===");
let mut snap = graph.read();
let outgoing_edge_count = snap.g().V([1]).union([__().outE(["knows"]), __().outE(["created"])]).count().next()?;
println!("marko's outE(knows) + outE(created), merged and counted: {:?}", outgoing_edge_count);
let names_and_id = snap.g().V([1]).union([__().values(["name"]), __().values(["id"])]).to_list()?;
println!("marko's name and id, merged into one stream: {:?}", names_and_id);
println!("\n=== coalesce() (idempotent upsert) ===");
for attempt in 1..=2 {
let mut tx = graph.begin();
let vertex_result = tx
.g()
.V([42])
.count()
.coalesce([
__().V([42]).values(["name"]),
__().addV("person").property("id", 42i64).property("name", "charlie"),
])
.next()?;
let edge_result = tx
.g()
.V([1])
.coalesce([
__().outE(["knows"]).r#where(__().otherV().hasId([42])),
__().addE("knows").from(1).to(42).property("weight", 0.9f64),
])
.next()?;
tx.commit()?;
println!("attempt {}: vertex branch -> {:?}, edge branch -> {:?}", attempt, vertex_result, edge_result);
}
println!("\n=== drop() on a property ===");
let mut tx = graph.begin();
tx.g().V([1]).outE(["knows"]).properties(["note"]).drop().next()?;
tx.commit()?;
let mut snap = graph.read();
let note_after = snap.g().V([1]).outE(["knows"]).values(["note"]).next()?;
let weight_after = snap.g().V([1]).outE(["knows"]).values(["weight"]).next()?;
println!("knows-edge note after drop: {:?}", note_after);
println!("knows-edge weight after drop (untouched): {:?}", weight_after);
let mut tx = graph.begin();
tx.g().V([1]).properties(["never_set"]).drop().next()?;
tx.commit()?;
println!("\n=== drop() on edges and vertices ===");
let mut tx = graph.begin();
let blocked = tx.g().V([3]).drop().next();
match blocked {
Err(StoreError::IncidentEdges) => {
println!("dropping lop (id 3) while it has incident edges: blocked, as expected")
}
other => panic!("expected StoreError::IncidentEdges, got {:?}", other),
}
tx.rollback();
let mut tx = graph.begin();
tx.g().V([1]).outE(["created"]).drop().next()?;
tx.g().V([3]).drop().next()?;
tx.commit()?;
println!("dropped the created-edge, then vertex lop (id 3): succeeded");
let mut snap = graph.read();
let lop_still_there = snap.g().V([3]).next()?;
println!("lop after drop: {:?}", lop_still_there);
Ok(())
}