1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
use gremlin_client::{
    process::traversal::{traversal, GraphTraversalSource, SyncTerminator, __},
    structure::{List, Vertex, P},
    GremlinClient,
};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = GremlinClient::connect("localhost")?;

    let g = traversal().with_remote(client);

    create_graph(&g)?;

    let result = g
        .v(())
        .has_label("complex_vertex")
        .has(("name", "test1"))
        .out("complex_label")
        .out("complex_label")
        .value_map(())
        .next()?
        .expect("no vertices found");

    println!(
        "Found vertex with name {:?}",
        result["name"].get::<List>().unwrap()[0]
    );

    let results = g
        .v(())
        .has_label("complex_vertex")
        .has(("number", P::gt(3)))
        .to_list()?;

    println!(
        "Found {} vertices with number greater than 3",
        results.len()
    );

    let results = g
        .v(())
        .has_label("complex_vertex")
        .has(("number", P::within((3, 6))))
        .to_list()?;

    println!("Found {} vertices with number 3 or 6", results.len());

    let results = g
        .v(())
        .has_label("complex_vertex")
        .where_(__.out("complex_label").count().is(P::gte(1)))
        .to_list()?;

    println!(
        "Found {} vertices with 1 or more connected edges with label complex_label",
        results.len()
    );

    Ok(())
}

fn create_graph(
    g: &GraphTraversalSource<SyncTerminator>,
) -> Result<(), Box<dyn std::error::Error>> {
    g.v(()).has_label("complex_vertex").drop().next()?;
    g.e(()).has_label("complex_label").drop().next()?;

    let mut current_next: Option<Vertex> = None;
    (0..10).for_each(|e| {
        let next = g
            .add_v("complex_vertex")
            .property("name", format!("test{}", e))
            .property("number", e)
            .next()
            .expect("failed to create vertex");

        current_next.iter().zip(next.iter()).for_each(|(a, b)| {
            g.add_e("complex_label")
                .from(a)
                .to(b)
                .next()
                .expect("failed to create edge");
        });

        current_next = next;
    });

    Ok(())
}