一个轻量级内存图数据库

parvusdb的Python项目详细描述


parvusdb一个简单的内存图形数据库

要求

  • python图
  • hy
  • Python3.5

安装

pip3安装parvusdb

什么是parvusdb

parvusdb是一个处理图形操作的小型python3库。作为记忆 图形数据库。它用于小图(几百个节点)

图形格式

图是作为edgesvertices的集合编写的。顶点写为

{}(a)

其中a是顶点的名称。此名称用于顶点iself上的操作。 顶点可以在括号内写入属性

{'tag': 'PERSON', 'text': 'john'}(a)

括号内的文本采用json格式。 这些属性中的每一个都与节点关联并存储在图形中

边缘写为

{}(a,b)

其中,asource节点名,btarget节点名。 至于顶点,可以在括号内添加属性

{'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函数将无法正常工作

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java JBPM:无法部署进程存档:null   java将一个数组拆分为两个大小相等的数组   java Spring boot验证该字段是否为string类型   JAVA JPA保存到TSV而不是SQL   java PMD报告超过X个违规   java是否支持springdatagremlin中的自定义查询?   java在“for”循环后使用变量   JPQL中默认查询中的java错误列   如何在java中实现不同于线程的进程?   java如何检查字符串是否平衡?   xml使用xalan扩展在XSL中处理java集合   java我试图使用子类/超类重写另一个类的值   转换为JSON时出现java堆栈溢出问题   java考虑定义一个类型为“COM”的bean。实例演示。在您的配置中命令$DefaultIO   java在kubernetes中如何检索转发端口的值?   JavaEclipse,动态web项目,向类路径添加另一个eclipse项目   eclipse的java Spring上下文XML验证器?   Linux下利用MATLAB(Windows)生成Java包   Java:在存储到DDC之前验证属性   java校验字符串