2019独角兽企业重金招聘Python工程师标准>>>
1.Neo4j简介
Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上形成图谱而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性,如:事务,索引等。程序员工作在一个面向对象的、灵活的网络结构下而不是严格、静态的表中——但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。
在一个图中包含两种基本的数据类型:Nodes(节点) 和 Relationships(关系)。Nodes 和 Relationships 包含key/value形式的属性。Nodes通过Relationships所定义的关系相连起来,形成关系型网络结构。
目前的客户端接口方式包括:neo4j-shell,REST API,Driver(Java\.NET\JS\Python\Ruby\PHP)等等。截止此时,最新版本为3.2社区版和企业版,其中企业版支持HA集群。Neo4j中的语言采用Cypher,一种类似于SQL的语法格式。
Neo4j因其嵌入式、高性能、轻量级等优势,越来越受到关注。
2. 安装(单机社区版)
1).上Neo4j官网(https://neo4j.com/download)或(http://pacap.paic.com.cn/software/softwarepage/ 搜索neo4j)下载community社区版neo4j-community-3.1.3-unix.tar.gz,上传到Linux服务器(我这里是10.20.26.247),解压(tar -xvf neo4j-community-3.1.3-unix.tar.gz),同时需要安装jdk1.8,这里就不多说了。社区版解压之后目录如下:
注:Neo4j分为企业版和社区版,企业版是需要付费的。社区版是免费的。在基本功能上两个版本没有区别,企业版相比社区版拥有一些高级特性,如集群等。具体可参考官网https://neo4j.com/editions/关于两个版本的区别。对于一般中小型应用,社区版就足够用了,因此,这里选择社区版。当前最新稳定版为3.1.3。大约70多M。
2). 修改conf/neo4j.confj配置文件,将org.neo4j.server.webserver.address=0.0.0.0注释字符去掉(设为0.0.0.0后允许任意访问,默认为只允许本地访问)。
3). 最后进入bin目录,执行./neo4j start启动neo4j的服务即可。
3. 入门
既然是入门,那就从简单开始,一步一步熟悉Neo4j。
3.1 图形操作界面
运行Neo4j后,在浏览器中打开网页:http://10.20.26.247/:7474, 即可进入Neo4j的图形操作界面,默认的账号和密码为neo4j/neo4j。进入后需要修改密码。在里面可以直接操作数据库,也可以查看数据库的状态。如图:
页面顶端可以直接写Cypher语句并运行。
3.2 Cypher基本语句
Cypher是Neo4j的数据库语言,入门的话起码得知道增删改查吧。
· 插入节点。插入一个Person类别的节点,且这个节点有一个属性name,属性值为Andres
[size=1em]CREATE (nerson { name : 'Andres'}); |
· 插入边。插入一条a到b的有向边,且边的类别为Follow
[size=1em]MATCH (aerson),(berson) [size=1em]WHERE a.name = 'Node A' AND b.name = 'Node B' [size=1em]CREATE (a)-[r:Follow]->(b); |
· 更新节点。更新一个Person类别的节点,设置新的name。
[size=1em]MATCH (nerson { name: 'Andres' }) [size=1em]SET n.name = 'Taylor'; |
· 删除节点和与其相连的边。Neo4j中如果一个节点有边相连,是不能单单删除这个节点的。
[size=1em]MATCH (nerson { name:'Andres' }) [size=1em]DETACH DELETE n; |
· 删除边。
[size=1em]MATCH (aerson)-[r:Follow]->(berson) [size=1em]WHERE a.name = 'Andres' AND b.name = 'Taylor' [size=1em]DELETE r; |
接着就是查询语句了,作为图形数据库,肯定要来点与众不同的查询对吧。
· 最短路径。
[size=1em]MATCH (mserson { name:'Andres' }),(cserson { name:'Taylor' }), p = shortestPath((ms)-[r:Follow]-(cs)) RETURN p; |
· 查询两个节点之间的关系。
[size=1em]MATCH (aerson { name:'Andres' })-[r]->(b:Person { name:'Taylor' }) [size=1em]RETURN type(r); |
· 查询一个节点的所有Follower。
[size=1em]MATCH (:Person { name:'Taylor' })-[r:Follow]->(Person) [size=1em]RETURN Person.name; |
还有更多的操作可以参考官方用户手册:官方用户手册
3.3 示例(明星关系图)
在页面最上面的cypher的执行器里面,插入一些数据:
1) 创建索引
|
2) 创建对象及关系
|
1) 查明星之间的关系图:
|
2) 查询“周迅”的直接关系:
|
3) 查询“周迅和王菲”的最短路径:
|
3.4 Neo4j驱动
Neo4j提供了数种语言的数据库驱动,比如在java中,你可以这样创建一个图:
[size=1em]package neo4j; [size=1em]import java.sql.Connection; [size=1em]import java.sql.DriverManager; [size=1em]import java.sql.ResultSet; [size=1em]import java.sql.SQLException; [size=1em]import java.sql.Statement; [size=1em] [size=1em]import org.neo4j.jdbc.Driver; [size=1em]//Class.forName("org.neo4j.jdbc.Driver"); [size=1em] [size=1em]//Connect [size=1em] [size=1em]@SuppressWarnings("unused") [size=1em]public class Neo4jJdbc { [size=1em] [size=1em] public static void main(String[] args) throws SQLException { [size=1em] // TODO Auto-generated method stub [size=1em] Connection con = DriverManager.getConnection("jdbc:neo4j://10.20.26.247:7474/","neo4j","aic1234"); [size=1em] [size=1em] //Querying [size=1em] try(Statement stmt = con.createStatement()) [size=1em] { [size=1em] ResultSet rs = stmt.executeQuery("CREATE (ee1:员工 { 姓名: '小明', 来自: '湖北' , 年龄 : 29 })-[:爱]->(ee2:员工 { 姓名: '小红', 来自: '湖南' , 年龄 : 26 })"); [size=1em] while(rs.next()) [size=1em] { [size=1em] System.out.println(rs.getString("n")); [size=1em] } [size=1em] } [size=1em] [size=1em] } [size=1em] [size=1em]} |
执行java代码后在neo4j图形操作页面可以看到新建的关系图:
4. Neo4j常用适用场景
· 社交网络
· 基于图的搜索
· 推荐引擎
· 欺诈检测
· 企业基础设施及网络架构
· 等等等
目前,业内已经有了相对比较成熟的基于图数据库的解决方案,大致可以分为以下几类。
1.金融行业应用
1)反欺诈多维关联分析场景
通过图分析可以清楚地知道洗钱网络及相关嫌疑,例如对用户所使用的帐号、发生交易时的IP地址、MAC地址、手机IMEI号等进行关联分析。
上图在图数据库中一个典型的反洗钱模型
2)反欺诈多维关联分析场景
反欺诈已经是金融行业一个核心应用,通过图数据库可以对不同的个体、团体做关联分析,从人物在指定时间内的行为,例如去过地方的IP地址、曾经使用过的MAC地址(包括手机端、PC端、WIFI等)、社交网络的关联度分析,同一时间点是否曾经在同一地理位置附近出现过,银行账号之间是否有历史交易信息等。
上图为在图数据库中一个典型的金融反欺诈关联分析模型
2.社交网络图谱
在社交网络中,公司、员工、技能的信息,这些都是节点,它们之间的关系和朋友之间的关系都是边,在这里面图数据库可以做一些非常复杂的公司之间关系的查询。比如说公司到员工、员工到其他公司,从中找类似的公司、相似的公司,都可以在这个系统内完成。
上图在图数据库中典型的社交关系网络模型
5.图数据库的优缺点
数十年来,开发者试图使用关系型数据库处理关联的、半结构化的数据集。关系型数据库设计之初是为了处理纸质表格以及表格化结构,它们试图对这种实际中的特殊联系进行建模。然而讽刺的是,关系型数据库在处理联系上做得却并不好。
关系数据库是强大的主流数据库,经过40年的发展和改进,已经非常可靠、强大并且很实用,可以保存大量的数据。如果你想查询关系型数据库里的单一结构或对应数据信息的话,在任何时间内都可以查询关于项目的信息,或者你想查询许多项目在相同类型中的总额或平均值,也将会很快得到答案。
关系型数据库不擅长什么呢?当你寻找数据项、关系模式或多个数据项之间的关系时,它们常会以失败告终。
例如在下面这个例子中,我们希望在一个社交网络里找到最大深度为5的朋友的朋友。假设随机选择两个人,是否存在一条路径,使得关联他们的关系长度最多为5?对于一个包含100万人,每人约有50个朋友的社交网络,我们就以典型的开源图数据库Neo4j参与测试,结果明显表明,图数据库是用于关联数据的最佳选择,如表所示:
上图为图数据库与关系型数据库执行时间对比
在深度为2时(即朋友的朋友),假设在一个在线系统中使用,无论关系型数据库还是图数据库,在执行时间方面都表现得足够好。虽然Neo4j的查询时间为关系数据库的2/3,但终端用户很难注意到两者间毫秒级的时间差异。当深度为3时(即朋友的朋友的朋友),很明显关系型数据库无法在合理的时间内实现查询:一个在线系统无法接受30s的查询时间。相比之下,Neo4j的响应时间则保持相对平坦:执行查询仅需要不到1s,这对在线系统来说足够快了。
在深度为4时,关系型数据库表现出很严重的延迟,使其无法应用于在线系统。Neo4j所花时间也有所增加,但其时延在在线系统的可接受范围内。最后,在深度为5时,关系型数据库所花时间过长以至于没有完成查询。相比之下,Neo4j则在2 s左右的时间就返回了结果。在深度为5时,事实证明几乎整个网络都是我们的朋友,因此在很多实际用例中,我们可能需要修剪结果,并进行时间控制。
虽然图数据库也能够处理“大数据”,但它毕竟不是Hadoop、HBase或Cassandra,通常不会在图数据库中直接处理海量数据(以PB为单位)的分析。但如果你乐于提供关于某个实体及其相邻数据的关系(比如可以提供一个Web页面或某个API返回其结果),那么它是一种良好的选择。无论是简单的CRUD访问,或是复杂的、深度嵌套的资源视图都能够胜任。
综上所述,虽然关系型数据库对于保存结构化数据来说依然是最佳的选择,但图数据库更适合于管理半结构化数据、非结构化数据以及图形数据。如果数据模型中包含大量的关联数据,并且希望使用一种直观、有趣并且快速的数据库进行开发,那么可以考虑尝试图数据库。
在实际的生产环境下,一个真正成熟、有效的分析环境是应该包括关系型数据库和图数据库的,根据不同的应用场景相互结合起来进行有效分析。
整体而言,图数据库还有很多问题未解决,许多技术还需发展,比如超级节点问题和分布式大图的存储。可以预见的是,随着互联网数据的膨胀,图数据库将迎来发展契机,基于图的各种计算和数据挖掘岗位也会越来越热。
Graph Database是一个很特殊的数据库类型,和RDBMS还有其他的NoSQL都不同。可以说,是最直观表达真实世界的一种数据库,可以使用的场景也非常明确。图数据库不是应用于海量数据库的分析,而是使用在Relationship的Traverse上。主要应用场景有:
1、推荐引擎
2、反欺诈、反洗钱
3、运维组件依赖管理
4、社交网络关系查询
图数据库也有很多实现方法。Neo4J属于Native Graph Database。除此之外,还有很多基于RDBMS和NoSQL数据库实现的Graph Engine。所以图数据库分为两个层面,一个是Graph Storage,一个是Graph Processing Engine。Graph Storage包括Native Storage,也包括基于PG、MongoDB、Cassandra等的Storage。
现在图数据库还没有形成一个标准,Neo4J在这个领域算是领军产品,但其他的产品也在层出不穷。从架构设计到访问语言都没有统一。