1 个不稳定版本
0.1.0 | 2020年7月3日 |
---|
#3 in #tinkerpop
162 每月下载量
用于 3 个crate(直接使用2个)
6KB
96 行
Gremlin-rs
Apache TinkerPop™ 的 Rust 驱动和工具。
gremlin-client
Apache TinkerPop™ 的 Rust 客户端。
安装
从 crates.io 安装
[dependencies]
gremlin-client = "0.8"
支持 async-std
[dependencies]
gremlin-client = { version = "0.8", features = ["async-std-runtime"] }
支持 tokio
[dependencies]
gremlin-client = { version = "0.4.0", features = ["tokio-runtime"] }
示例
基本用法
执行一个简单的 Gremlin 查询并收集结果
同步
use gremlin_client::{GremlinClient, Vertex};
fn main() -> Result<(), Box<std::error::Error>> {
let client = GremlinClient::connect("localhost")?;
let results = client
.execute("g.V(param)", &[("param", &1)])?
.filter_map(Result::ok)
.map(|f| f.take::<Vertex>())
.collect::<Result<Vec<Vertex>, _>>()?;
println!("{:?}", results);
Ok(())
}
异步
使用 async-std
激活特性 async-std-runtime
gremlin-client= {version= "*",features= ["async-std-runtime"] }
use gremlin_client::{aio::GremlinClient, Vertex};
use async_std::prelude::*;
#[async_std::main]
async fn main() -> Result<(), Box<std::error::Error>> {
let client = GremlinClient::connect("localhost").await?;
let results = client.execute("g.V(param)", &[("param", &1)]).await?
.filter_map(Result::ok)
.map(|f| f.take::<Vertex>())
.collect::<Result<Vec<Vertex>, _>>().await?;
println!("{:?}", results);
Ok(())
}
使用 tokio
激活特性 tokio-runtime
gremlin-client= {version= "*",features= ["tokio-runtime"] }
use gremlin_client::{aio::GremlinClient, Vertex};
use tokio_stream::StreamExt;
#[tokio::main]
async fn main() -> Result<(), Box<std::error::Error>> {
let client = GremlinClient::connect("localhost").await?;
let results = client.execute("g.V(param)", &[("param", &1)]).await?
.filter_map(Result::ok)
.map(|f| f.take::<Vertex>())
.collect::<Result<Vec<Vertex>, _>>().await?;
println!("{:?}", results);
Ok(())
}
Traversal 示例 Rust GLV
使用提供的 GremlinClient
创建远程遍历并使用 Rust 语言构建遍历。
同步
use gremlin_client::{GremlinClient, Vertex, process::traversal::traversal};
fn main() -> Result<(), Box<std::error::Error>> {
let client = GremlinClient::connect("localhost")?;
let g = traversal().with_remote(client);
let results = g.v(()).has_label("person").has(("name","Jon")).to_list()?;
println!("{:?}", results);
Ok(())
}
异步
使用 async-std
use gremlin_client::{aio::GremlinClient, Vertex, process::traversal::traversal};
use async_std::prelude::*;
#[async_std::main]
async fn main() -> Result<(), Box<std::error::Error>> {
let client = GremlinClient::connect("localhost").await?;
let g = traversal().with_remote_async(client);
let results = g.v(()).has_label("person").has(("name","Jon")).to_list().await?;
println!("{:?}", results);
Ok(())
}
使用 tokio
use gremlin_client::{aio::GremlinClient, Vertex, process::traversal::traversal};
use tokio_stream::StreamExt;
#[tokio::main]
async fn main() -> Result<(), Box<std::error::Error>> {
let client = GremlinClient::connect("localhost").await?;
let g = traversal().with_remote_async(client);
let results = g.v(()).has_label("person").has(("name","Jon")).to_list().await?;
println!("{:?}", results);
Ok(())
}
其他特性
derive
特性
通过在 Cargo.toml 中包含 derive
特性
[dependencies]
gremlin-client = { version = "*", features = ["derive"] }
提供两个 derive 宏
- FromGMap
- FromGValue
您可以使用它们将 GMap 和 GValue(目前只有 Map)映射到结构体。
与 GValue
use gremlin_client::derive::{FromGMap, FromGValue};
use gremlin_client::process::traversal::traversal;
use gremlin_client::GremlinClient;
use std::convert::TryFrom;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = GremlinClient::connect("localhost")?;
#[derive(Debug, PartialEq, FromGValue, FromGMap)]
struct Person {
name: String,
}
let results = client
.execute("g.V(param).valueMap()", &[("param", &1)])?
.filter_map(Result::ok)
.map(|f| Person::try_from(f))
.collect::<Result<Vec<Person>, _>>()?;
println!("Person {:?}", results[0);
Ok(())
}
与 GMap
use gremlin_client::derive::FromGMap;
use gremlin_client::process::traversal::traversal;
use gremlin_client::GremlinClient;
use std::convert::TryFrom;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = GremlinClient::connect("localhost")?;
#[derive(Debug, PartialEq, FromGMap)]
struct Person {
name: String,
}
let g = traversal().with_remote(client);
let results = g
.v(1)
.value_map(())
.iter()?
.filter_map(Result::ok)
.map(Person::try_from)
.collect::<Result<Vec<Person>, _>>()?;
println!("Person {:?}", results[0);
Ok(())
}
开发
编译
git clone https://github.com/wolf4ood/gremlin-rs.git
cd gremlin-rs
cargo build
运行测试
一些测试是在 Gremlin Server 的运行实例上运行的,安装了内存图样本。
您可以使用 docker-compose 启动一个实例进行测试。使用环境变量 GREMLIN_SERVER
指定 Gremlin Server 的版本
cd docker-compose
export GREMLIN_SERVER=3.4.4
docker-compose up -d
cd ..
cargo test --all-features
gremlin-cli
用于在 Gremlin Server 中探索图数据的最小 cli。
安装
cargo install gremlin-cli
或最新版本 这里
依赖项
~1.5MB
~33K SLoC