一个轻量级内存图数据库
parvusdb的Python项目详细描述
parvusdb一个简单的内存图形数据库
要求
- python图
- hy
- Python3.5
安装
pip3安装parvusdb
什么是parvusdb
parvusdb是一个处理图形操作的小型python3库。作为记忆 图形数据库。它用于小图(几百个节点)
图形格式
图是作为edges和vertices的集合编写的。顶点写为
{}(a)
其中a
是顶点的名称。此名称用于顶点iself上的操作。
顶点可以在括号内写入属性
{'tag': 'PERSON', 'text': 'john'}(a)
括号内的文本采用json格式。 这些属性中的每一个都与节点关联并存储在图形中
边缘写为
{}(a,b)
其中,a
是source节点名,b
是target节点名。
至于顶点,可以在括号内添加属性
{'relation': 'LIVES_AT'}(a,b)
顶点也可以有一个名称,尽管它必须作为属性给定
{'relation': 'LIVES_AT', 'name': 'r1'}(a,b)
因此,三元组可以用这种形式书写。
{'tag': 'PERSON', 'text': 'john'}(a), {'relation': 'LIVES_AT'}(a,b), {'tag': 'PLACE', 'text': 'London'}(b)
图形数据库的关键字
有6个命令(必须用大写字母输入)
- 创建
- 删除
- 匹配
- 返回
- 设置
- 其中
关键字create
此命令将在右侧创建图形
CREATE {'tag': 'PERSON', 'text': 'john'}(a), {'relation': 'LIVES_AT'}(a,b), {'tag': 'PLACE', 'text': 'London'}(b);
关键字匹配
此命令将图形与右侧指定的拓扑和属性相匹配
MATCH {'tag': 'PERSON'}(a), {'relation': 'LIVES_AT', 'name': 'r1'}(a,b), {'tag': 'PLACE'}(b);
关键字delete
此关键字删除右侧有名称的顶点或边
DELETE a, b, r1
关键字where
此关键字允许用户指定lisp代码作为匹配条件。
例如,如果我们希望节点a
的“text”参数位于名称列表中
MATCH {'tag': 'PERSON'}(a), {'relation': 'LIVES_AT', 'name': 'r1'}(a,b), {'tag': 'PLACE'}(b)
WHERE (in (get a "text") ["john" "joseph" "joachim"]);
关键字集
这个命令允许我们修改图形的内容。
例如,如果要更改节点的文本a
MATCH {'tag': 'PERSON'}(a), {'relation': 'LIVES_AT', 'name': 'r1'}(a,b), {'tag': 'PLACE'}(b)
SET (assoc a "text" "not john anymore");
关键字return
此命令用于返回特定节点或边的属性
MATCH {'tag': 'PERSON'}(a), {'relation': 'LIVES_AT', 'name': 'r1'}(a,b), {'tag': 'PLACE'}(b)
RETURN a, r1;
返回值将是表单的列表
[{'a': {'tag': 'PERSON', 'text': 'john'}, 'r1': {'relation': 'LIVES_AT'}}]
如果未指定顶点或边名称,系统将返回整个图形(以“parvusdb格式”)。
python3代码示例
让我们将一个三元组添加到图中
fromigraphimportGraphfromparvusdbimportGraphDatabaseif__name__=='__main__':g=Graph(directed=True)db=GraphDatabase(g)creation_string=""" CREATE {'tag': 'PERSON', 'text': 'john'}(a), {'relation': 'LIVES_AT'}(a,b), {'tag': 'PLACE', 'text': 'London'}(b) RETURN; """lst=db.query(creation_string)print(lst)
从而产生输出
[{'GRAPH': "{'tag': 'PERSON', 'text': 'john'}(a), {'tag': 'PLACE', 'text': 'London'}(b), {'relation': 'LIVES_AT'}(a,b)"}]
然后我们可以尝试匹配三元组的元素
fromigraphimportGraph,plotfromparvusdbimportGraphDatabaseif__name__=='__main__':g=Graph(directed=True)db=GraphDatabase(g)creation_string=""" CREATE {'tag': 'PERSON', 'text': 'john'}(a), {'relation': 'LIVES_AT'}(a,b), {'tag': 'PLACE', 'text': 'London'}(b); """match_string=""" MATCH {}(a), {'relation': 'LIVES_AT'}(a,b), {}(b) RETURN a,b; """lst=db.query(creation_string)lst=db.query(match_string)print(lst)
输出
[{'a': {'name': 'a', 'tag': 'PERSON', 'text': 'john'}, 'b': {'name': 'b', 'tag': 'PLACE', 'text': 'London'}}]
我们可以使用where来限制匹配过程
fromigraphimportGraph,plotfromparvusdbimportGraphDatabaseif__name__=='__main__':g=Graph(directed=True)db=GraphDatabase(g)creation_string=""" CREATE {'tag': 'PERSON', 'text': 'john'}(a), {'relation': 'LIVES_AT'}(a,b), {'tag': 'PLACE', 'text': 'London'}(b) CREATE {'tag': 'PERSON', 'text': 'joseph'}(v1), {'relation': 'LIVES_AT'}(v1,v2), {'tag': 'PLACE', 'text': 'London'}(v2) """match_string=""" MATCH {}(_a), {'relation': 'LIVES_AT'}(_a,_b), {}(_b) WHERE (= (get _a "text") "joseph") RETURN _a,_b; """lst=db.query(creation_string)lst=db.query(match_string)print(lst)
输出
[{'_b':{'text':'London','tag':'PLACE','name':'v2'},'_a':{'text':'joseph','tag':'PERSON','name':'v1'}}]
待办事项
- graphdatabase.query_lines()中错误的处理
- 能够在where和set语句之外添加lisp代码
- 为数据库创建一个独立的命令行
- 能够匹配多个项目
已知问题
- igraph库不喜欢同一节点上的多条边, 因此,在这些情况下,match函数将无法正常工作