一个轻量级内存图数据库

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 GridBagLayout不填充区域   java Memozied Fibonacci未运行与常规Fibonacci解决方案   Java Web启动未启动问题   Java中异常和if-then的区别   java从命令提示符运行批处理文件获取错误   socket在Java中验证SSL证书的公共名称   如何在JAVA中检查字符串数组中的相等字   用java语言将音频文件转换成文本文件的语音识别   java为什么foo(1,2,3)没有传递给varargs方法foo(对象…)作为整数[]   java通过蓝牙将奇怪的数据从Arduino传输到Android   java ContainerRequestFilter获取空entitystream   java如何从安卓 studio中删除不兼容类型错误   基本Java错误   在Spring引导中使用REST API时发生java错误   javascript通过从SQL查询派生的URL打开页面