<header class="article-header">

<h1 class="article-title" itemprop="name">
图数据库-Neo4j-初探
</h1> <a href="/2018/08/17/图数据库-Neo4j-初探/" class="archive-article-date">
<time datetime="2018-08-17T05:15:46.000Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2018-08-17</time>

  </header>

<div class="article-entry" itemprop="articleBody">

    <p>本次初探主要学习如何安装<code>Neo4j</code>,以及<code>Cypher</code>的基本语法。</p>

1. 安装Neo4j

  • Desktop版本

    neo4j-desktop

  • Server版本(Community版)

    比较建议安装这个版本,因为Desktop版本的老是闪退,且要激活之类的。

    • 下载Neo4j数据库

      neo4j-server-community

    • 下载常用算法的插件

      将下载下来的算法插件放入到$NEO4J_HOME/plugins文件夹下

    • Service版修改配置文件$NEO4J_HOME/conf/neo4j.conf

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      # 解决登入的时候报没有授权的错误
      dbms.security.auth_enabled=false
      # 添加下载的算法插件
      dbms.security.procedures.unrestricted=apoc.*,algo.*
      apoc.import.file.enabled=true

      #增加页缓存到至少4G,推荐20G:
      dbms.memory.pagecache.size=4g
      #JVM堆保存留内存从1G起,最大4G:
      dbms.memory.heap.initial_size=1g
      dbms.memory.heap.max_size=4g
    • 启动/停止 (把server所在的路径添加到系统的PATH)

      1
      2
      3
      4
      5
      6
      7
      # 建议将neo4j所在的路径条件到系统$PATH当中,
      # export NEO4J_HOME="path-to-neo4j"
      $NEO4J_HOME/bin/neo4j start
      $NEO4J_HOME/bin/neo4j console
      $NEO4J_HOME/bin/neo4j stop
      $NEO4J_HOME/bin/neo4j start -u neo4j -p neo4j
      $NEO4J_HOME/bin/cypher-shell
      1
      CALL dbms.procedures() // 查看neo4j可用的进程,包括刚刚安装的插件

2. Cypher基本语法

  • Nodes基本语法

    在Cypher里面通过一对小括号代表一个节点

    • () 代表匹配任意一个节点
    • (node1) 代表匹配任意一个节点,并给它起了一个别名
    • (:Lable) 代表查询一个类型的数据
    • (person:Lable) 代表查询一个类型的数据,并给它起了一个别名
    • (person:Lable {name:”小王”}) 查询某个类型下,节点属性满足某个值的数据
    • (person:Lable {name:”小王”,age:23}) 节点的属性可以同时存在多个,是一个AND的关系
  • Relationship基本语法

    系用一对-组成,关系分有方向的进和出,如果是无方向就是进和出都查询

    • —> 指向一个节点
    • -[role]-> 给关系加个别名
    • -[:acted_in]-> 访问某一类关系
    • -[role:acted_in]-> 访问某一类关系,并加了别名
    • -[role:acted_in {roles:[“neo”,”Hadoop“]}]->
  • 创建/删除节点

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    // 插入一个Artist类别的节点,而且这个节点有一个属性为Name,值为Lady Gaga
    CREATE (a:Artist {Name:"Lady Gaga"})

    // 创建并返回
    CREATE (a:Artist {Name:"Lady Gaga", Gemder:"Femal"}) return a

    // 一次性创建多个
    CREATE (a:Album { Name: "Killers"}), (b:Album { Name: "Fear of the Dark"})
    RETURN a, b

    CREATE (a:Album { Name: "Piece of Mind"})
    CREATE (b:Album { Name: "Somewhere in Time"})
    RETURN a, b

    // 删除节点,如果这个节点和其他节点有连接的话,不能单单删除这个节点
    MATCH (a:Album {Name: "Killers"}) DELETE a

    // 一次性删除多个节点
    MATCH (a:Artist {Name: "Iron Maiden"}), (b:Album {Name: "Powerslave"})
    DELETE a, b

    // 删除所有节点
    MATCH (n) DELETE n
  • 创建/删除关系

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    // 对Lady Gaga和专辑PieceOfMind之间创建一个released的关系
    MATCH (a:Artist), (b:Album)
    WHERE a.Name = "Lady Gaga" AND b.Name = "Piece of Mind"
    CREATE (a)-[r:RELEASED]->(b)
    RETURN r

    MATCH (a:Artist), (b:Album), (p:Person)
    WHERE a.Name = "Strapping Young Lad" AND b.Name = "Heavy as a Really Heavy Thing" AND p.Name = "Devin Townsend"
    CREATE (p)-[pr:PRODUCED]->(b), (p)-[pf:PERFORMED_ON]->(b), (p)-[pl:PLAYS_IN]->(a)
    RETURN a, b, p

    // 删除指定的关系
    MATCH (:Artist)-[r:RELEASED]-(:Album)
    DELETE r

    MATCH (:Artist {Name: "Strapping Young Lad"})-[r:RELEASED]-(:Album {Name: "Heavy as a Really Heavy Thing"})
    DELETE r

    // 删除所有的关系
    MATCH ()-[r:RELEASED]-()
    DELETE r

    // 清除所有节点和关系
    MATCH (n)
    OPTIONAL MATCH
    (n)-[r]-()
    DELETE n,r

    // 删除整个数据库
    MATCH (n) DETACH DELETE n

  • 创建/删除约束

    SQL一样,Neo4j数据库支持对Noderelationship的属性的UNIQUE约束

    1
    2
    3
    CREATE CONSTRAINT ON (a:Artist) ASSERT a.Name IS UNIQUE

    DROP CONSTRAINT ON (a:Artist) ASSERT a.Name IS UNIQUE
  • 创建/删除索引

    1
    2
    3
    4
    5
    6
    CREATE INDEX ON :Album(Name)

    // View the schema
    :schema

    DROP INDEX ON :Album(Name)
  • 更新一个节点/边

    1
    2
    MATCH (n:Person { name: "Andres" })
    SET n.name = "Taylor";
  • 筛选过滤

    1
    2
    3
    4
    5
    6
    7
    8
    9
    // WHERE
    MATCH (p1: Person)-[r:friend]->(p2: Person)
    WHERE p1.name=~"K.+" or p2.age=24 or "neo" in r.rels
    RETURN p1, r, p2

    // NOT
    MATCH (p:Person)-[:ACTED_IN]->(m)
    WHERE NOT (p)-[:DIRECTED]->()
    RETURN p, m
  • 结果集返回

    1
    2
    3
    4
    5
    MATCH (p:Person)
    RETURN p, p.name AS name, upper(p.name), coalesce(p.nickname,"n/a") AS nickname, { name: p.name, label:head(labels(p))} AS person

    MATCH (n)
    RETURN DISTINCT n.name;
  • 聚合函数

    Cypher支持count, sum, avg, min, max

    聚合的时候null会被跳过

    count 语法 支持 count( distinct role )

    1
    2
    3
    4
    5
    6
    MATCH (actor:Person)-[:ACTED_IN]->(movie:Movie)<-[:DIRECTED]-(director:Person)
    RETURN actor,director,count(*) AS collaborations

    // 收集聚合结果
    MATCH (m:Movie)<-[:ACTED_IN]-(a:Person)
    RETURN m.title AS movie, collect(a.name) AS cast, count(*) AS actors
  • 排序和分页

    1
    2
    3
    MATCH (a:Person)-[:ACTED_IN]->(m:Movie)
    RETURN a, count(*) AS appearances
    ORDER BY appearances DESC SKIP 3 LIMIT 10;
  • Union 联合

    1
    2
    3
    4
    5
    MATCH (actor:Person)-[r:ACTED_IN]->(movie:Movie)
    RETURN actor.name AS name, type(r) AS acted_in, movie.title AS title
    UNION (ALL)
    MATCH (director:Person)-[r:DIRECTED]->(movie:Movie)
    RETURN director.name AS name, type(r) AS acted_in, movie.title AS title
  • With语句

    with语句给Cypher提供了强大的pipeline能力,可以一个或者query的输出,或者下一个query的输入 和return语句非常类似,唯一不同的是,with的每一个结果,必须使用别名标识。

    使用with我们可以在查询结果里面在继续嵌套查询。

    1
    2
    3
    4
    MATCH (p:Person)-[:ACTED_IN]->(m:Movie)
    WITH p, count(*) AS appearances, COLLECT(m.Title) AS movies
    WHERE appearances > 1
    RETURN p.name, appearances, movies

    有点类似SQL中的having,这里是with + where两个一起来实现的。

  • 查询最短路径

    1
    2
    MATCH (ms:Person { name: "Node A" }),(cs:Person { name:"Node B" }), p = shortestPath((ms)-[r:Follow]-(cs)) 
    RETURN p;
  • 加载数据

    Cypher Neo4j Couldn’t load the external resource

    neo4j初探

    加载存在本地server上的数据,会在路径前面自动加个前缀 /path-to-neo4j/neo4j-community-3.4.5/import,即Server对应所在的路径下的import

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    // 加载address
    LOAD CSV WITH HEADERS FROM "file:///data/addresses.csv" AS csvLine
    CREATE (p:Person {id: toInt(csvLine.id), email: csvLine.address })

    // 加载email
    LOAD CSV WITH HEADERS FROM "file:///data/emails.csv" AS csvLine
    CREATE (e:Email {id: toInt(csvLine.id), time: csvLine.time, content: csvLine.content })


    // 创建收发关系
    USING PERIODIC COMMIT 500 // 分段加载
    LOAD CSV WITH HEADERS FROM "file:///data/relations.csv" AS csvLine
    MATCH (p1:Person {id: toInt(csvLine.fromId)}),(e:Email { id: toInt(csvLine.emailId)}),(p2:Person{ id: toInt(csvLine.toId)})
    CREATE UNIQUE (p1)-[:FROM]->(e)
    CREATE(e)-[:TO]->(p2)

    如果需要导入其他地方的,可以使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    LOAD CSV FROM "https://path-to-csv" AS csvLine
    CREATE (:Genre {GenreId: csvLine[0], Name: csvLine[1]})

    // 使用csv中的header
    LOAD CSV WITH HEADERS FROM "https://path-to-csv" AS csvLine
    CREATE (:Genre {GenreId: csvLine.Id, Name: csvLine.Track, Length: csvLine.Length})

    // 自定义csv文件中的分隔符
    LOAD CSV WITH HEADERS FROM "https://path-to-csv" AS csvLine FIELDTERMINATOR ";"
  • 使用 neo4j-import 导入数据

    使用neo4j-import导入数据

    • 使用条件
      • 需要先关闭neo4j
      • 无法再原有的数据库添加,只能重新生成一个数据库
      • 导入文件格式为csv
    • 参数
      • —into:数据库名称
      • —bad-tolerance:能容忍的错误数据条数(即超过指定条数程序直接挂掉),默认1000
      • —multiline-fields:是否允许多行插入(即有些换行的数据也可读取)
      • —nodes:插入节点
      • —relationships:插入关系
      • 更多参数可允许命令bin/neo4j-import
    1
    bin/neo4j-import --multiline-fields=true --bad-tolerance=1000000 --into graph.db --id-type string --nodes:person node.csv  --relationships:related relation_header.csv,relation.csv

    运行完后,将生成的graph.db放入data/databases,覆盖原有数据库,启动运行即可

3. References

    <div class="page-reward">
<a href="javascript:;" class="page-reward-btn tooltip-top">
<div class="tooltip tooltip-east">
<span class="tooltip-item">

</span>
<span class="tooltip-content">
<span class="tooltip-text">
<span class="tooltip-inner">
<p class="reward-p"><i class="icon icon-quo-left"></i>Thanks for your donate.<i class="icon icon-quo-right"></i></p>
<div class="reward-box"> <div class="reward-box-item">
<img class="reward-img" src="/images/alipay.jpeg">
<span class="reward-type">支付宝</span>
</div> </div>
</span>
</span>
</span>
</div>
</a>
</div> </div>
<div class="article-info article-info-index"> <div class="article-tag tagcloud">
<i class="icon-price-tags icon"></i>
<ul class="article-tag-list"> <li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color5">图数据库</a>
</li> <li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color1">Neo4j</a>
</li> </ul>
</div>








  <div class="clearfix"></div>
</div>

原文地址:https://chenson.cc/2018/08/17/图数据库-Neo4j-初探/

图数据库-Neo4j-初探的更多相关文章

  1. 图数据库Neo4j

    官网下载:https://neo4j.com/download/ 图数据库Neo4j入门:https://blog.csdn.net/gobitan/article/details/68929118 ...

  2. 图数据库Neo4j简介

    图数据库Neo4j简介 转自: 图形数据库Neo4J简介 - loveis715 - 博客园https://www.cnblogs.com/loveis715/p/5277051.html 最近我在用 ...

  3. 主流图数据库Neo4J、ArangoDB、OrientDB综合对比:架构分析

    主流图数据库Neo4J.ArangoDB.OrientDB综合对比:架构分析 YOTOY 关注 0.4 2017.06.15 15:11* 字数 3733 阅读 16430评论 2喜欢 18 1: 本 ...

  4. Hello World 之Spring Boot 调用图数据库Neo4j

    明日歌 [清]钱鹤滩 明日复明日,明日何其多! 我生待明日,万事成蹉跎 1. 图数据库Neo4j之爱的初体验 ----与君初相识,犹似故人归 在如今大数据(big data)横行的时代,传统的关系型数 ...

  5. 开源软件:NoSql数据库 - 图数据库 Neo4j

    转载自原文地址:http://www.cnblogs.com/loveis715/p/5277051.html 最近我在用图形数据库来完成对一个初创项目的支持.在使用过程中觉得这种图形数据库实际上挺有 ...

  6. (三)图数据库neo4j的安装配置

    (一)neo4j安装 neo4j有社区版本和企业版,社区版本是免费的,企业版本是收费的.在linux上安装如下步骤: 1.将下载的neo4j-enterprise-3.4.0-unix.tar.gz包 ...

  7. 知识图谱之图数据库Neo4j

    知识图谱中的知识是通过RDF结构来进行表示的,其基本单元是事实.每个事实是一个三元组(S, P, O),在实际系统中,按照存储方式的不同,知识图谱的存储可以分为基于表结构的存储和基于图结构的存储. 基 ...

  8. 图数据库neo4j和关系数据库的区别

    相信您和我一样,在使用关系型数据库时常常会遇到一系列非常复杂的设计问题.例如一部电影中的各个演员常常有主角配角之分,还要有导演,特效等人员的参与.通常情况下这些人员常常都被抽象为Person类型,对应 ...

  9. 图数据库Neo4j的基本使用及与SpringBoot集成

    Neo4j 官网地址:https://neo4j.com/ 下载地址:https://neo4j.com/download-center/#community 官方入门文档:https://neo4j ...

  10. linux环境图数据库neo4j安装

    自定义yum源 Neo4j Stable Yum Repo First, you'll want our key: cd /tmp wget http://debian.neo4j.org/neote ...

随机推荐

  1. oracle行转列和列转行(pivot 和 unpivot 函数,wm_concat函数 )

    create table demo(id int,name varchar(20),nums int); ---- 创建表insert into demo values(1, '苹果', 1000); ...

  2. Spring boot 配置 Tomcat 临时文件缓存目录

    1. 问题现象 spring boot 项目中,Tomcat 接收到 content-type 为 multipart/form-data 的请求时,需要将接收的文件缓存到临时目录(默认下载 /tmp ...

  3. 冲刺阶段——Day1

    [成员分工及任务量] 成员 分工 任务量(小时) 王梓鸿 完成页面设计并编写输入输出图形界面,部分代码测试 20 童皓祯 编写注册和登录模块代码,部分代码测试 20 林郅聪 绘制燃尽图,程序功能整合及 ...

  4. 冲刺总结——Day7

    [今日进展] 代码整合 码云链接:https://gitee.com/jxxydwt1999/20175215-java/tree/master/GoldPoint 功能测试 注册 登录 运行 [燃尽 ...

  5. 网络1911、1912 C语言第0次作业批改总结

    网络1911.1912 C语言第0次作业批改总结 题目:C博客作业00--我的第一篇博客 一.评分规则 总分10分,每个问题都务必回答,分值都在问题后面 抄袭 - 0分 博客作业格式不规范,没有用Ma ...

  6. How to Publish a NuGet Package

    How to Publish a NuGet Package Command line To push packages to nuget.org you must use nuget.exe v4. ...

  7. Git missing Change-Id in commit message footer解决方法

    Git missing Change-Id in commit message footer解决方法在Git向服务器提交代码时,出现如下错误missing Change-Id in commit me ...

  8. array_splice 在数组某位置插入数据

    $arr=array('a','b','c','d','e','f','g');//目标数组 $i_arr=array(');//要插入的数组 $n=;//插入的位置 array_splice($ar ...

  9. python基础----redis模块

    数据库 关系型数据 例如mysql,有表还有约束条件等 非关系型 k-v形式 memcache 存在内存中 redis 存在内存 mongodb 数据存在磁盘 import redis #string ...

  10. Hadoop 部署之 ZooKeeper (二)

    目录 一.Zookeeper功能简介 二.ZooKeeper基本概念 1.集群角色 三.ZooKeeper 的安装 1.下载安装(在datanode节点安装) 2.配置ZooKeeper环境变量 3. ...