内容简介: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 的相关介绍。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
解密硅谷
[美]米歇尔 E. 梅西纳(Michelle E. Messina)、乔纳森 C. 贝尔(Jonathan C. Baer) / 李俊、李雪 / 机械工业出版社 / 2018-12 / 50.00
《解密硅谷》由身处硅谷最中心的连续创业者米歇尔·梅西纳和资深的投资人乔纳森·贝尔联合撰写,二人如庖丁解牛一般为读者深入剖析硅谷成功的原因:从硅谷的创新机制、创业生态、投资领域的潜规则、秘而不宣的价值观等角度,让阅读本书的人能够在最短的时间内,拥有像硅谷人一样的商业头脑,从而快速发现机遇,顺利地躲过创业的坑,熬过创业生死挑战中的劫数,带领初创公司顺利地活下去,并实现快速增长。 如果初创公司能够......一起来看看 《解密硅谷》 这本书的介绍吧!