#graph #tinkerpop #proc-macro

gremlin-derive

gremlin-rs™ 的进程宏

1 个不稳定版本

0.1.0 2020年7月3日

#3 in #tinkerpop

Download history 24/week @ 2023-12-18 43/week @ 2024-01-15 20/week @ 2024-01-22 16/week @ 2024-01-29 14/week @ 2024-02-05 25/week @ 2024-02-12 13/week @ 2024-02-19 24/week @ 2024-02-26 18/week @ 2024-03-04 33/week @ 2024-03-11 37/week @ 2024-03-18 42/week @ 2024-03-25 47/week @ 2024-04-01

162 每月下载量
用于 3 个crate(直接使用2个)

Apache-2.0

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