<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. ArcGIS超级工具SPTOOLS-SHP转数据库,批量数据库转数据库,栅格彩色转黑白

    1.1  SHP转数据库 把一个文件夹的数据,转到数据库,或者另一个文件夹,不含字文件夹 1.2  批量数据库转数据库 把一个文件夹下GDB或者MDB,转到另一个文件夹为MDB,GDB,并实现版本的转 ...

  2. Canvas-基本用法

    Canvas教程-MDN HTML 5 Canvas 参考手册 <canvas>是一个可以使用脚本(通常为JavaScript)来绘制图形的 HTML 元素.例如,它可以用于绘制图表.制作 ...

  3. python核心模块方法

    ********************os模块: os.remove() 删除文件 os.unlink() 删除文件 os.rename() 重命名文件 os.listdir() 列出指定目录下所有 ...

  4. 5G 与 MEC 边缘计算

    目录 文章目录 目录 前言 参考文献 通信网络 核心网演进之路 早古时期 2G 网络架构 3G 网络架构 4G 网络架构 5G 5G 网络的需求 5G 网络架构的设计原则 5G 网络的逻辑架构 5G ...

  5. 比特币区块的hash算法

    Block hashing algorithm Bitcoin mining uses the hashcash proof of work function; the hashcash algori ...

  6. jQuery.data() 即($.data())的实现方式

    jQuery.data() 的作用是为普通对象或 DOM Element 附加(及获取)数据.     下面将分三个部分分析其实现方式:     1. 用name和value为对象附加数据:即传入三个 ...

  7. k8s install kubeadm网络原因访问不了谷哥and gpg: no valid OpenPGP data found. 解决办法

    gpg: no valid OpenPGP data found. 解决办法 待做.................................... 卡助在这curl -s https://pa ...

  8. Unity学习笔记_控制人物移动+摄像机跟随

    我想做的移动操作方式类似[流星蝴蝶剑].[龙之谷].[我的世界第三人称]的第三人称操作方式. 操作说明:W键会朝当前镜头方向前进,鼠标控制镜头旋转. 做前需知(先去稍微了解一下比较好): ①unity ...

  9. 从Odds:比值比推导出Logtic分类的算法

    在从概率模型推导出逻辑回归算法模型的博文中,我试着从李宏毅老师的课程中讲到的概率模型去推导逻辑分类的算法模型.有幸看到另外一篇博文01 分类算法 - Logistic回归 - Logit函数,我了解到 ...

  10. Git速成学习第四课:解决冲突

    Git速成学习笔记整理于廖雪峰老师的官网网站:https://www.liaoxuefeng.com/ 我们继续练习,准备新的feature1分支. $ git checkout -b feature ...