neo4rs 0.2.5

neo4j driver in rust
Documentation

Neo4rs CircleCI

Neo4rs is a native rust driver implemented using bolt 4.1 specification

Getting Started

    //Run a query
    let uri = "127.0.0.1:7687".to_owned();
    let user = "neo4j";
    let pass = "neo";
    let graph = Graph::new(&uri, user, pass).await.unwrap();
    assert!(graph.run(query("RETURN 1")).await.is_ok());
    
    //Concurrent queries
    let uri = "127.0.0.1:7687";
    let user = "neo4j";
    let pass = "neo";
    let graph = Arc::new(Graph::new(&uri, user, pass).await.unwrap());
    for _ in 1..=42 {
        let graph = graph.clone();
        tokio::spawn(async move {
            let mut result = graph.execute(
	       query("MATCH (p:Person {name: $name}) RETURN p").param("name", "Mark")
	    ).await.unwrap();
            while let Ok(Some(row)) = result.next().await {
        	let node: Node = row.get("p").unwrap();
        	let name: String = node.get("name").unwrap();
                println!("{}", name);
            }
        });
    }
    
    //Transactions
    let mut txn = graph.start_txn().await.unwrap();
    txn.run_queries(vec![
        query("CREATE (p:Person {name: 'mark'})"),
        query("CREATE (p:Person {name: 'jake'})"),
        query("CREATE (p:Person {name: 'luke'})"),
    ])
    .await
    .unwrap();
    txn.commit().await.unwrap(); //or txn.rollback().await.unwrap();
    
    
    //Create and parse relationship
    let mut result = graph
        .execute(query("CREATE (p:Person { name: 'Mark' })-[r:WORKS_AT {as: 'Engineer'}]->(neo) RETURN r"))
        .await
        .unwrap();
	
    let row = result.next().await.unwrap().unwrap();
    
    let relation: Relation = row.get("r").unwrap();
    assert!(relation.id() > 0);
    assert!(relation.start_node_id() > 0);
    assert!(relation.end_node_id() > 0);
    assert_eq!(relation.typ(), "WORKS_AT");
    assert_eq!(relation.get::<String>("as").unwrap(), "Engineer");

Installation

neo4rs is available on crates.io and can be included in your Cargo enabled project like this:

[dependencies]
neo4rs = "0.2.3"

Roadmap

  • bolt protocol
  • stream abstraction
  • query.run() vs query.execute() abstraction
  • respect "has_more" flag returned for PULL
  • connection pooling
  • explicit transactions
  • use buffered TCP streams
  • query & transaction macros/dsl
  • improve logging
  • add support for older versions of the protocol
  • multi db support
  • support data types
    • Float
    • Bytes
  • support structures
    • Relationship
    • UnboundedRelationship
    • Path
    • Date
    • Time
    • LocalTime
    • DateTime
    • DateTimeZoneId
    • LocalDateTime
    • Duration
    • Point2D
    • Point3D