neo4j初体验

Neo4j简介

1. 什么是图数据库?

  生活中经常用到“图(Graph)”这个词。其含义很有可能与图数据库里的图不同。事实上,大多数人当谈论到图时会想到:饼图(pie charts)、柱状图(bar charts)、图形(graphics)等,这些都不是我们所说的图。

  图实际上是一个相当古老的概念,首次出现在著名的瑞士数学家莱昂哈德·欧拉(Leonhard Euler)的学术论文中

哥尼斯堡七桥问题

简化后的七桥问题

  图只不过是两个或多个实体之间关联的抽象数学表示,为实体对象间的相互关系进行建模。通常由以下部分组成:

  • 节点,即前面提到的对象或实体:数学中通常称为顶点(vertices),而在图数据库中,比如Neo4j,通常称为节点(nodes)。
  • 节点之间的连接:数学中称为边(edges),而在图数据库中称为关系(relationships)。
  • 节点和关系相互连接构成一个图:许多重要的度量指标,例如连接到一个节点的边数(称之为度)就可以确定下来。许多其他度量指标也就自然形成。

图数据库

  图数据库(Graph database) 并非指存储图片的数据库,而是以图这种数据结构存储和查询数据。图形数据库是一种在线数据库管理系统,具有处理图形数据模型的创建,读取,更新和删除(CRUD)操作。与其他数据库不同,关系在图数据库中占首要地位。这意味着应用程序不必使用外键或带外处理(如MapReduce)来推断数据连接。与关系数据库或其他NoSQL数据库相比,图数据库的数据模型也更加简单,更具表现力。图形数据库是为与事务(OLTP)系统一起使用而构建的,并且在设计时考虑了事务完整性和操作可用性。

  图形数据库是一个设计用来将数据之间的关系视为对数据本身同样重要的数据库。它旨在保存数据,而不是将其压缩到预定义的模型中。相反,数据被存储起来,就像我们首先把它画出来一样——显示每个个体实体是如何与他人联系或相关联的。

2. 为什么要使用图数据库?

优点

  • 关系查询效率更高
  • 数据存储没有模式定义
  • 结果展示更有表现力
  • 关联查询时,是否需要预知隐式外键

应用场景

  • 社交领域 :Facebook, Twitter,Linkedin用它来管理社交关系,实现好友推荐
  • 零售领域 :eBay,沃尔玛使用它实现商品实时推荐,给买家更好的购物体验
  • 金融领域 :摩根大通,花旗和瑞银等银行在用图数据库做风控处理
  • 汽车制造领域 :沃尔沃,戴姆勒和丰田等顶级汽车制造商依靠图数据库推动创新制造解决方案
  • 电信领域 :Verizon, Orange和AT&T 等电信公司依靠图数据库来管理网络,控制访问并支持客户
  • 酒店领域 :万豪和雅高酒店等顶级酒店公司依使用图数据库来管理复杂且快速变化的库存

3. 什么是Neo4j

概念

  Neo4j是一个高性能的,NOSQL数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事物特性的java持久化引擎。Neo4j也可以看作是一个高性能的图引擎,该引擎具有成熟数据库所有特性。

  在属性图中,图由顶点(节点),边(关系),属性组成,每个顶点和边都可以有一个或多个属性,Neo4j创建的图是用顶点和边构建的有向图。

关系模型转图模型的几个原则

  • A row is a node.
  • A table name is a label name.
  • A join or foreign key is a relationship.

关系模型

图模型

4. Cypher

语法

//一个查询示例
MATCH (n:BasicCommunity{community_id:'123'}) WHERE n.community_id = '123456'
MATCH (m:BasicDevice)-[r:BELONG_TO]->(n)
RETURN m,n

  以上总结一下,() 表示节点,{} 表示属性,[] 表示关系,: 右边表示标签。

  • 创建节点
CREATE (friend:Person {name: 'Mark'})
RETURN friend
  • 创建关系
MATCH (jennifer:Person {name: 'Jennifer'})
MATCH (mark:Person {name: 'Mark'})
CREATE (jennifer)-[rel:IS_FRIENDS_WITH]->(mark)
//this query will create duplicate nodes for Mark and Jennifer
//CREATE (j:Person {name: 'Jennifer'})-[rel:IS_FRIENDS_WITH]->(m:Person {name: 'Mark'})
  • 创建/更新/删除属性
// set节点属性
MATCH (p:Person {name: 'Jennifer'})
SET p.birthdate = date('1980-01-01')
RETURN p
// set关系属性
MATCH (:Person {name: 'Jennifer'})-[rel:WORKS_FOR]-(:Company {name: 'Neo4j'})
SET rel.startYear = date({year: 2018})
RETURN rel
  • 删除节点
//只删除节点
MATCH (m:Person {name: 'Mark'})
DELETE m
//同时删除节点及其关系
MATCH (m:Person {name: 'Mark'})
DETACH DELETE m
  • MERGE (does a “select-or-insert” operation)
//Merge节点
MERGE (mark:Person {name: 'Mark'})
RETURN mark
//Merge关系
MATCH (j:Person {name: 'Jennifer'})
MATCH (m:Person {name: 'Mark'})
MERGE (j)-[r:IS_FRIENDS_WITH]->(m)
RETURN j, r, m

   注意: MERGE操作必须先分别MATCHMERGE,否则可能会创建重复的模式。例如如下语句会把两个节点和一个关系视作一个模式。

MERGE (m:ZzSchoolKeyman {name: 'cz'})-[r:STUDY]->(j:ZzSchool {school_name: 'whdx'})
RETURN j, r, m

CQLSQL对比

  • sql语言查询订单信息、商品信息、销售员信息等
select 
    e.first_name,
    e.last_name,
    o.order_date,
    od.quantity,
    od.discount,
    od.unit_price,
    p.product_name
from 
    employee e
inner join 
    orders o on o.employee_id = e.employee_id
inner join 
    order_detail od on od.order_id = o.order_id
inner join
    product p on od.product_id = p.product_id
where
    o.order_id = '123456'
  • cypher语言查询订单信息、商品信息、销售员信息等
match (o:Orders) where o.order_id = '123456'
match (e:Employee)-[rel_sold:SOLD]->(o)-[rel_include:INCLUDE]->(od:OrderDetail)<-[rel_part_of:PART_OF]-(p:Product)
return o,e,od,p,rel_sold,rel_include,rel_part_of

Neo4j原理

集群架构

书签

  在执行事务时,客户端可以请求书签(Bookmark),然后以该书签作为下一个事务的参数。使用书签功能,集群可以确保其中的服务器只有处理了客户端的书签事务后才能够运行其下一个事务。这提供了一个因果链,从客户的角度确保行为的正确性。

  书签是指向某些操作的指针。当为其他相关工作创建新会话时,可以使用已经创建的书签。书签确保之后的操作对依赖于先前的操作。无论数据是否已复制到集群的每个实例,书签都保证下一个操作会被应用于先前设置了标签的实例。

【程序4-39】创建书签
Driver driver = GraphDatabase.driver( seedUri, Authtokens.basic( "neo4j",
"neo4j" ) );
String bookmark;
try ( Session session = driver.session( AccessMode.WRITE ) )
{
    try ( Transaction tx = session.beginTransaction() )
    {
      tx.run( "CREATE (person:Person {name: {name}, title: {title}})",
              parameters( "name", "Arthur", "title", "king" ) );
      tx.success();
      tx.close();
    }
    finally
    {
      bookmark = session.lastBookmark();
    }
}
return bookmark;
    
【程序4-40】使用书签
try ( Session session = driver.session( AccessMode.READ ) )
{
    StatementResult result;
    try ( Transaction tx = session.beginTransaction( bookmark ) )
    {
      result = tx.run( "MATCH (person:Person {name: {name}}) RETURN
person.title",
              parameters( "name", "Arthur" ) );
      tx.success();
          tx.close();
          while ( result.hasNext() )
          {
              Record record = result.next();
              System.out.println( "Arthur's title is " +
    record.get( "person.title" ) );
          }
      }
    }

数据结构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT果果日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值