neo4rs 0.1.1

neo4j driver in rust
Documentation

Neo4rs CircleCI

Neo4rs is a native rust driver implemented using bolt 4.1 specification

Getting Started

Run a simple query, discard the response data

    let uri = "127.0.0.1:7687".to_owned();
    let user = "neo4j";
    let pass = "neo4j";
    let graph = Graph::connect(uri, user, pass).await.unwrap();
    assert!(graph.query("RETURN 1").run().await.is_ok());

Create a node and process the response

    let graph = Graph::connect(uri, user, pass).await.unwrap();
    let mut result = graph
        .query("CREATE (friend:Person {name: $name}) RETURN friend")
        .param("name", "Mark")
        .execute()
        .await
        .unwrap();
    let row = result.next().await.unwrap();
    let node: Node = row.get("friend").unwrap();
    let id = node.id();
    let labels = node.labels();
    let name: String = node.get("name").unwrap();
    assert_eq!(name, "Mark");
    assert_eq!(labels, vec!["Person"]);

Drain the result stream

   
    let graph = Graph::connect(uri, user, pass).await.unwrap();
    let mut result = graph
        .query("MATCH (p:Person {name: 'Mark'}) RETURN p")
        .execute()
        .await
        .unwrap();

    while let Some(row) = result.next().await {
        let node: Node = row.get("friend").unwrap();
        let name: String = node.get("name").unwrap();
	//process name & node
    }

Create explicit transactions

    let graph = Graph::connect(uri, user, pass).await.unwrap();
    let txn = graph.begin_txn().await.unwrap();
    graph.query("CREATE (p:Person {id: 'some_id'})").run().await.unwrap();
    txn.commit().await.unwrap();
    
    //Rollback a transaction
    //txn.rollback().await.unwrap();

Create and parse relationship

    let graph = Graph::connect(uri, user, pass).await.unwrap();
    let mut result = graph
        .query("CREATE (p:Person { name: 'Mark' })-[r:WORKS_AT {as: 'Engineer'}]->(neo) RETURN r")
        .execute()
        .await
        .unwrap();
	
    let row = result.next().await.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.1.1"

Roadmap

  • bolt protocol
  • stream abstraction
  • query.run() vs query.execute() abstraction
  • explicit transactions
  • use buffered TCP streams
  • connection pooling & multiplexing
  • multi db support
  • support data types
    • Float
    • Bytes
  • support structures
    • Relationship
    • UnboundedRelationship
    • Path
    • Date
    • Time
    • LocalTime
    • DateTime
    • DateTimeZoneId
    • LocalDateTime
    • Duration
    • Point2D
    • Point3D
  • batch queries/pipelining
  • add support for older versions of the protocol
  • Secure connection
  • documentation