内容简介:Neo4j是一个世界领先的开源图形数据库,由 Java 编写。图形数据库也就意味着它的数据并非保存在表或集合中,而是保存为节点以及节点之间的关系。Neo4j 的数据由下面几部分构成:Neo4j 除了顶点(Node)和边(Relationship),还有一种重要的部分——属性。无论是顶点还是边,都可以有任意多的属性。属性的存放类似于一个 HashMap,Key 为一个字符串,而 Value 必须是基本类型或者是基本类型数组。
Neo4j是一个世界领先的开源图形数据库,由 Java 编写。图形数据库也就意味着它的数据并非保存在表或集合中,而是保存为节点以及节点之间的关系。
Neo4j 的数据由下面几部分构成:
- 节点
- 边
- 属性
Neo4j 除了顶点(Node)和边(Relationship),还有一种重要的部分——属性。无论是顶点还是边,都可以有任意多的属性。属性的存放类似于一个 HashMap,Key 为一个字符串,而 Value 必须是基本类型或者是基本类型数组。
在Neo4j中,节点以及边都能够包含保存值的属性,此外:
- 可以为节点设置零或多个标签(例如 Author 或 Book)
- 每个关系都对应一种类型(例如 WROTE 或 FRIEND_OF)
- 关系总是从一个节点指向另一个节点(但可以在不考虑指向性的情况下进行查询)
Neo4j的特点
- 它拥有简单的查询语言 Neo4j CQL
- 它遵循属性图数据模型
- 它通过使用 Apache Lucence 支持索引
- 它支持 UNIQUE 约束
- 它包含一个用于执行 CQL 命令的 UI:Neo4j 数据浏览器
- 它支持完整的 ACID(原子性,一致性,隔离性和持久性)规则
- 它采用原生图形库与本地 GPE(图形处理引擎)
- 它支持查询的数据导出到 Json 和 XLS 格式
- 它提供了 REST API,可以被任何编程语言(如 Java,Spring,Scala 等)访问
- 它提供了可以通过任何 UI MVC 框架(如 Node JS )访问的 Java 脚本
- 它支持两种 Java API:Cypher API 和 Native Java API 来开发 Java 应用程序
Neo4j安装
可以到官网直接下载安装包安装即可,链接: https://neo4j.com/download/ 。
Neo4j CQL命令
Neo4j 的 CQL 是非常重要的命令,类似于 SQL 语句,具体的用法可以参考: https://www.w3cschool.cn/neo4j/neo4j_cql_introduction.html 。
Py2Neo用法
Py2Neo 是用来对接 Neo4j 的 Python 库,接下来对其详细介绍。
相关链接
安装方法
使用 Pip 安装即可:
pip3 install py2neo
Node & Relationship
Neo4j 里面最重要的两个数据结构就是节点和关系,即 Node 和 Relationship,可以通过 Node 或 Relationship 对象创建,实例如下:
from py2neo import Node, Relationship
a = Node('Person', name='Alice')
b = Node('Person', name='Bob')
r = Relationship(a, 'KNOWS', b)
print(a, b, r)
运行结果:
(alice:Person {name:"Alice"}) (bob:Person {name:"Bob"}) (alice)-[:KNOWS]->(bob)
这样我们就成功创建了两个 Node 和两个 Node 之间的 Relationship。
Node 和 Relationship 都继承了 PropertyDict 类,它可以赋值很多属性,类似于字典的形式,例如可以通过如下方式对 Node 或 Relationship 进行属性赋值,接着上面的代码,实例如下:
a['age'] = 20 b['age'] = 21 r['time'] = '2017/08/31' print(a, b, r)
运行结果:
(alice:Person {age:20,name:"Alice"}) (bob:Person {age:21,name:"Bob"}) (alice)-[:KNOWS {time:"2017/08/31"}]->(bob)
可见通过类似字典的操作方法就可以成功实现属性赋值。
另外还可以通过 setdefault() 方法赋值默认属性,例如:
a.setdefault('location', '北京')
print(a)
运行结果:
(alice:Person {age:20,location:"北京",name:"Alice"})
可见没有给 a 对象赋值 location 属性,现在就会使用默认属性。
但如果赋值了 location 属性,则它会覆盖默认属性,例如:
a['location'] = '上海'
a.setdefault('location', '北京')
print(a)
运行结果:
(alice:Person {age:20,location:"上海",name:"Alice"})
另外也可以使用 update() 方法对属性批量更新,接着上面的例子实例如下:
data = {
'name': 'Amy',
'age': 21
}
a.update(data)
print(a)
运行结果:
(alice:Person {age:21,location:"上海",name:"Amy"})
可以看到这里更新了 a 对象的 name 和 age 属性,没有更新 location 属性,则 name 和 age 属性会更新,location 属性则会保留。
Subgraph
Subgraph,子图,是 Node 和 Relationship 的集合,最简单的构造子图的方式是通过关系运算符,实例如下:
from py2neo import Node, Relationship
a = Node('Person', name='Alice')
b = Node('Person', name='Bob')
r = Relationship(a, 'KNOWS', b)
s = a | b | r
print(s)
运行结果:
运行结果:
在这里我们用 NodeSelector 来筛选 age 为 21 的 Person Node,实例如下:
运行结果:
[(d195b2e:Person {age:21,location:"广州",name:"Alice"}), (eefe475:Person {age:21,location:"北京",name:"Mike"})]
在这里用了正则表达式匹配查询。
另外也可以使用 order_by() 进行排序:
from py2neo import Graph, NodeSelector
graph = Graph(password='123456')
selector = NodeSelector(graph)
persons = selector.select('Person').order_by('_.age')
print(list(persons))
运行结果:
[(e3fc3d7:Person {age:21,location:"广州",name:"Alice"}), (da0179d:Person {age:21,location:"北京",name:"Mike"}), (cafa16e:Person {age:22,location:"上海",name:"Bob"})]
前面返回的都是列表,如果要查询单个节点的话,可以使用 first() 方法,实例如下:
结语
以上便是对 Neo4j 的相关介绍。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Rework
Jason Fried、David Heinemeier Hansson / Crown Business / 2010-3-9 / USD 22.00
"Jason Fried and David Hansson follow their own advice in REWORK, laying bare the surprising philosophies at the core of 37signals' success and inspiring us to put them into practice. There's no jarg......一起来看看 《Rework》 这本书的介绍吧!
HTML 编码/解码
HTML 编码/解码
XML、JSON 在线转换
在线XML、JSON转换工具