9 个版本
0.2.7 | 2023年2月12日 |
---|---|
0.2.6 | 2021年8月17日 |
0.2.4 | 2021年3月30日 |
0.1.0 | 2021年3月20日 |
#405 in 解析器实现
39 次每月下载
在 5 个crate中(3个直接) 使用
65KB
1.5K SLoC
图定义语言 (GDL)
受 Neo4j Cypher 查询语言的启发,GDL 允许简单地定义属性图。GDL 包含一个解析器和表示属性图及其元素的简单结构体。Rust 实现受我的 Java 实现 启发。
属性图数据模型
属性图由节点和关系组成。节点可以有零个或多个标签,关系有一个或零个关系类型。节点和关系都有属性,以键值对的形式组织。关系是有向的,从源节点开始,指向目标节点。
快速入门示例
use gdl::{CypherValue, Graph};
use std::rc::Rc;
let gdl_string = "(alice:Person { name: 'Alice', age: 23 }),
(bob:Person { name: 'Bob', age: 42 }),
(alice)-[r:KNOWS { since: 1984 }]->(bob)";
let graph = gdl_string.parse::<gdl::Graph>().unwrap();
assert_eq!(graph.node_count(), 2);
assert_eq!(graph.relationship_count(), 1);
let alice = graph.get_node("alice").unwrap();
assert_eq!(alice.property_value("age"), Some(&CypherValue::from(23)));
assert_eq!(alice.property_value("name"), Some(&CypherValue::from("Alice")));
let relationship = graph.get_relationship("r").unwrap();
assert_eq!(relationship.rel_type(), Some("KNOWS"));
更多 GDL 语言示例
定义一个节点
let g = "()".parse::<gdl::Graph>().unwrap();
assert_eq!(g.node_count(), 1);
定义一个节点并将其赋值给变量 alice
let g = "(alice)".parse::<gdl::Graph>().unwrap();
assert!(g.get_node("alice").is_some());
定义一个带有标签 User
和多个属性的节点
let g = "(alice:User { name: 'Alice', age : 23 })".parse::<gdl::Graph>().unwrap();
assert_eq!(g.get_node("alice").unwrap().labels().collect::<Vec<_>>(), vec!["User"]);
assert!(g.get_node("alice").unwrap().property_value("name").is_some());
assert!(g.get_node("alice").unwrap().property_value("age").is_some());
定义出站关系
let g = "(alice)-->()".parse::<gdl::Graph>().unwrap();
assert_eq!(g.relationship_count(), 1);
定义入站关系
let g = "(alice)<--()".parse::<gdl::Graph>().unwrap();
assert_eq!(g.relationship_count(), 1);
定义类型为 KNOWS
的关系,将其赋值给变量 r1
并添加一个属性
use std::rc::Rc;
let g = "(alice)-[r1:KNOWS { since : 2014 }]->(bob)".parse::<gdl::Graph>().unwrap();
assert!(g.get_relationship("r1").is_some());
assert_eq!(g.get_relationship("r1").unwrap().rel_type(), Some("KNOWS"));
从同一源节点(即 alice
)定义多个出站关系
let g = "
(alice)-[r1:KNOWS { since : 2014 }]->(bob)
(alice)-[r2:KNOWS { since : 2013 }]->(eve)
".parse::<gdl::Graph>().unwrap();
assert_eq!(g.node_count(), 3);
assert_eq!(g.relationship_count(), 2);
定义路径(创建四个节点和三个关系)
let g = "()-->()<--()-->()".parse::<gdl::Graph>().unwrap();
assert_eq!(g.node_count(), 4);
assert_eq!(g.relationship_count(), 3);
路径可以用逗号分隔,以表示任意复杂的模式
let g = "
()-->()<--()-->(),
()<--()-->()-->(),
()-->()<--()-->()
".parse::<gdl::Graph>().unwrap();
assert_eq!(g.node_count(), 12);
assert_eq!(g.relationship_count(), 9);
许可
Apache 2.0 或 MIT
依赖
~1.2–1.9MB
~38K SLoC