use apache_age::sync::{AgeClient, Client};
use apache_age::{AgType, NoTls, Vertex};
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, Clone)]
struct Person {
pub name: String,
pub surname: String,
}
pub fn main() {
let mut client = Client::connect_age(
"host=localhost user=postgres password=passwd port=8081",
NoTls,
)
.unwrap();
client.create_graph("my_apache_graph").unwrap();
assert!(client.graph_exists("my_apache_graph").unwrap());
client
.simple_query(
&("SELECT * FROM cypher('".to_string()
+ "my_apache_graph"
+ "', $$ "
+ "CREATE(n:Person {name: 'T', surname: 'Doe'}) "
+ "RETURN n "
+ "$$) AS (v agtype)"),
)
.unwrap();
match client.query(
&("SELECT v FROM ag_catalog.cypher('".to_string()
+ "my_apache_graph"
+ "', $$ "
+ "MATCH(n: Person) WHERE n.name='T' "
+ "RETURN n "
+ "$$) AS (v ag_catalog.agtype)"),
&[],
) {
Err(_e) => {}
Ok(query) => {
for row in query {
let person_vertex: Vertex<Person> = row.get(0);
assert_eq!(person_vertex.label(), "Person");
assert_eq!(person_vertex.properties().surname, "Doe");
}
}
}
assert!(client
.execute_cypher(
"my_apache_graph",
"CREATE(n: Person {name: $name, surname: $surname})",
Some(AgType::<Person>(Person {
name: "John".into(),
surname: "Doe".into(),
})),
)
.is_ok());
assert!(client
.execute_cypher::<()>(
"my_apache_graph",
"CREATE(n: Person {name: 'Ask', surname: 'Me'})",
None,
)
.is_ok());
let rows = client
.query_cypher::<()>(
"my_apache_graph",
"
MATCH (n: Person)
WHERE n.name = 'Ask'
RETURN {name: n.name, surname: n.surname}
",
None,
)
.unwrap();
let x: AgType<Person> = rows[0].get(0);
assert_eq!(x.0.surname, "Me");
let statement = client
.prepare_cypher(
"my_apache_graph",
"MATCH (n: Person) WHERE n.name = 'John' RETURN n",
false,
)
.unwrap();
let x = client.query(&statement, &[]).unwrap();
let john_doe: Vertex<Person> = x[0].get(0);
assert_eq!(john_doe.properties().surname, "Doe");
client
.required_constraint("my_apache_graph", "Person", "myconstraint", "surname")
.unwrap();
client
.unique_index("my_apache_graph", "Person", "myuniq", "name")
.unwrap();
assert!(client
.execute_cypher::<()>(
"my_apache_graph",
"CREATE (p: Person { name: 'No surname' })",
None
)
.is_err());
assert!(client
.execute_cypher::<()>(
"my_apache_graph",
"CREATE (p: Person { name: 'John', surname: 'Repeated name' })",
None
)
.is_err());
client.drop_graph("my_apache_graph").unwrap();
}