Rust Neo4j数据库驱动宏库neo4rs-macros的使用,高效实现Rust与Neo4j图数据库的无缝交互
Rust Neo4j数据库驱动宏库neo4rs-macros的使用,高效实现Rust与Neo4j图数据库的无缝交互
安装
在项目目录中运行以下Cargo命令:
cargo add neo4rs-macros
或者在Cargo.toml中添加以下行:
neo4rs-macros = "0.3.0"
使用示例
以下是一个完整的示例,展示如何使用neo4rs-macros与Neo4j数据库进行交互:
use neo4rs::*;
use neo4rs_macros::*;
#[derive(GraphEntity, Debug)]
struct Person {
#[id]
id: i64,
name: String,
age: i32,
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 连接Neo4j数据库
let uri = "bolt://localhost:7687";
let user = "neo4j";
let pass = "password";
let graph = Graph::new(uri, user, pass).await?;
// 创建节点
let person = Person {
id: 0, // 新节点会自动分配ID
name: "Alice".to_string(),
age: 30,
};
// 使用宏生成的查询方法
let query = person.create_query();
graph.run(query).await?;
// 查询节点
let query = Person::match_query().filter("name = 'Alice'");
let mut result = graph.execute(query).await?;
while let Ok(Some(row)) = result.next().await {
let person: Person = row.try_into()?;
println!("Found person: {:?}", person);
}
Ok(())
}
功能说明
#[derive(GraphEntity)]
宏自动为结构体生成Neo4j节点映射#[id]
属性标记ID字段,用于节点识别- 自动生成CRUD查询方法:
create_query()
- 创建节点match_query()
- 查询节点update_query()
- 更新节点delete_query()
- 删除节点
完整示例代码
以下是一个更完整的示例,包含更多CRUD操作:
use neo4rs::*;
use neo4rs_macros::*;
// 定义Person节点
#[derive(GraphEntity, Debug, Clone)]
struct Person {
#[id]
id: i64,
name: String,
age: i32,
email: Option<String>, // 可选字段
}
// 定义Movie节点
#[derive(GraphEntity, Debug)]
struct Movie {
#[id]
id: i64,
title: String,
year: i32,
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 连接Neo4j数据库
let graph = Graph::new("bolt://localhost:7687", "neo4j", "password").await?;
// 1. 创建节点
let person = Person {
id: 0, // 新节点ID设为0,数据库会自动分配
name: "Bob".to_string(),
age: 35,
email: Some("bob@example.com".to_string()),
};
let movie = Movie {
id: 0,
title: "The Matrix".to_string(),
year: 1999,
};
// 创建Person节点
graph.run(person.create_query()).await?;
// 创建Movie节点
graph.run(movie.create_query()).await?;
// 2. 查询节点
let query = Person::match_query()
.filter("name = 'Bob' AND age > 30");
let mut result = graph.execute(query).await?;
while let Ok(Some(row)) = result.next().await {
let person: Person = row.try_into()?;
println!("查询到Person: {:?}", person);
}
// 3. 更新节点
let mut person_to_update = Person {
id: 1, // 假设这是数据库中已存在的ID
name: "Bob".to_string(),
age: 36, // 更新年龄
email: Some("new-email@example.com".to_string()),
};
graph.run(person_to_update.update_query()).await?;
// 4. 删除节点
let person_to_delete = Person {
id: 1, // 要删除的节点ID
name: "".to_string(), // 这些字段在删除时不需要
age: 0,
email: None,
};
graph.run(person_to_delete.delete_query()).await?;
// 5. 创建关系
let relation_query = query("MATCH (p:Person {name: $name}), (m:Movie {title: $title})
CREATE (p)-[r:ACTED_IN {role: $role}]->(m)")
.param("name", "Bob")
.param("title", "The Matrix")
.param("role", "Neo");
graph.run(relation_query).await?;
Ok(())
}
功能说明
- 支持定义复杂的节点结构,包含可选字段
- 支持完整的CRUD操作
- 支持关系创建和查询
- 自动生成的查询方法可以与原生查询混合使用
- 支持异步操作,与Tokio运行时完美集成
许可证
MIT License
1 回复