use graph_api_lib::EdgeReference;
use graph_api_lib::EdgeSearch;
use graph_api_lib::Graph;
use graph_api_lib::SupportsEdgeLabelIndex;
use graph_api_lib::VertexReference;
use graph_api_simplegraph::SimpleGraph;
use graph_api_test::Edge;
use graph_api_test::EdgeExt;
use graph_api_test::Person;
use graph_api_test::Vertex;
use graph_api_test::populate_graph;
fn main() {
let mut graph = SimpleGraph::new();
let refs = populate_graph(&mut graph);
vertex_context_example(&graph, refs.bryn, refs.julia);
edge_context_example(&graph, refs.bryn);
}
fn vertex_context_example<G>(graph: &G, bryn_id: G::VertexId, julia_id: G::VertexId)
where
G: Graph<Vertex = Vertex, Edge = Edge> + SupportsEdgeLabelIndex,
{
let knows: Vec<_> = graph
.walk()
.vertices_by_id(vec![bryn_id, julia_id])
.push_default_context()
.edges(EdgeSearch::scan().outgoing())
.filter_knows()
.head()
.map(|target, ctx| {
if let Vertex::Person { name, .. } = ctx.vertex() {
format!(
"{} knows {}",
name,
target.project::<Person<_>>().unwrap().name()
)
} else {
"Not a person".to_string()
}
})
.collect::<Vec<_>>();
assert_eq!(knows.len(), 2);
println!("Vertex Context Example - Relationships found:");
for relationship in &knows {
println!("- {}", relationship);
}
}
fn edge_context_example<G>(graph: &G, person_id: G::VertexId)
where
G: Graph<Vertex = Vertex, Edge = Edge> + SupportsEdgeLabelIndex,
{
let edge_types = graph
.walk()
.vertices_by_id(vec![person_id])
.edges(EdgeSearch::scan().outgoing())
.push_context(|edge, _ctx| {
match edge.weight() {
Edge::Created => "Created",
Edge::Knows { .. } => "Knows",
Edge::Language(_) => "Language",
}
})
.map(|_v, c| *c)
.collect::<Vec<_>>();
println!("{:?}", edge_types);
}