图数据库常规的有:neo4j(支持超多语言)、JanusGraph/Titan(分布式)、Orientdb,google也开源了图数据库Cayley(Go语言构成)、PostgreSQL存储RDF格式数据。

—- 目前的几篇相关:—–
neo4j︱图数据库基本概念、操作罗列与整理(一)
neo4j︱Cypher 查询语言简单案例(二)
neo4j︱Cypher完整案例csv导入、关系联通、高级查询(三)

neo4j系列第二篇,一个简单的demo案例,从构建-基本内容查询。


一、三要素:节点、关系、模式

1.1 节点

基本用法:

MATCH (node:Label) RETURN node.propertyMATCH (node1:Label1)-->(node2:Label2)
WHERE node1.propertyA = {value}
RETURN node2.propertyA, node2.propertyB

我们通常用圆括号来包含节点标示符(当然也可以不用)。里面的内容也叫变量,变量不是单指某一个节点,而是服从条件的节点组合。如(p: Person),如果想添加属性:(p: Person {name: “yinglish”})。 注意:节点标签、关系类型和属性名称区分大小写。
其中节点之间用:’–>’,包含关系的可以用’->’

1.2 关系

有以下几种关系型写法:

-[rel:KNOWS]-> //单关系,关系的变量名为rel,类型是 KNOWS
(a)-[:KNOWS|:LIKE]->(b) //查询a到b的两类关系
-[{since:2010}]-> //附加属性
-[:KNOWS*..4]-> example: a -[rel: type*minHop..maxHop]-> b
//从a节点到b节点最少可经过minHop、最大可经过maxHop个节点

关系表达,cypher语法:

举例:

MATCH (n1:Label1)-[rel:TYPE]->(n2:Label2)
WHERE rel.property > {value}
RETURN rel.property, type(rel)

1.3 模式 Patterns

其功能为:Patterns can be used to MATCH and CREATE data, but also (evaluating to a list of paths) in expressions, predicates and results.
patterns 模式由一个或多个路径组成,路径间用逗号分隔,一条路径就是一个节点和关系的序列,这个序列指定开始和结束节点,如:(a) –> (b),这条路径开始于a,通过outgoing关系指向b。如果你不在乎具体是哪个节点,不用指定它,只需要用空括号来表示就可以了,如:a –>()–>b。模式是cypher中的关键部分,灵活书写模式能帮我们正确获取、实现推测计算等等各种任务。

  • friend-of-a-friend (user)-[:KNOWS]-(friend)-[:KNOWS]-(foaf)
  • shortest path: path = shortestPath( (user)-[:KNOWS*..5]-(other) )
  • collaborative filtering
    (user)-[:PURCHASED]->(product)<-[:PURCHASED]-()-[:PURCHASED]->(otherProduct)
  • tree navigation
    (root)<-[:PARENT*]-(leaf:Category)-[:ITEM]->(data:Product)

比较费解…

.


二、使用案例demo

从0开始构建一个非常小的关系网络结构,来简单应用cypher语言。
来源:GraphGist: First Steps with Cypher by Michael Hunger

1、创建自己’You’的节点

CREATE (you:Person {name:"You"})
RETURN you

2、创建与自己关系的节点

MATCH (you:Person {name:"You"})
CREATE (you)-[like:LIKE]->(neo:Database {name:"Neo4j" })
RETURN you,like,neo

match到’You’节点之后,新建一条关系,是’You’-‘like’-‘neo4j’。
当create之后,return之后,就会返回三个实体,2个节点+1条关系。
match中,变量-变量,可以用’–>’,关系型的指向用’->’

3、批量创建与自己有关的朋友

MATCH (you:Person {name:"You"})
FOREACH (name in ["Johan","Rajesh","Anna","Julia","Andrew"] |CREATE (you)-[:FRIEND]->(:Person {name:name}))

其中,foreach表示循环,反复create。再来看一个foreach的案例(from:3.3.15. FOREACH):

MATCH p =(begin)-[*]->(END )
WHERE begin.name = 'A' AND END .name = 'D'
FOREACH (n IN nodes(p)| SET n.marked = TRUE )

4、查询你的朋友圈

match (you {name:'You'})-[:FRIEND]->(yf)
return you,yf

通过关系查询’You’的朋友圈

5、新建朋友圈之外的二度关系

match (neo:Database {name : 'Neo4j'})
create (anna:Person {name:'Anna'})-[:FRIEND]->(ama:Person:Expert {name:'Amanda'})-[:WORKED_WITH]->(neo)
return neo,anna,ama


创建了’Anna’-‘Amanda’的朋友关系,创建了’Amanda’-‘neo’的工作关系。
同时,定义了’Amanda’的’Expert’身份。

6、查询:我通过朋友圈的谁来学习neo4j

match (you:Person {name:"You"})
match (expert)-[:WORKED_WITH]->(neo:Database {name:'Neo4j'})
match path = shortestPath((you)-[:FRIEND*..5]-(expert))
return path,you,expert,neo

先定位自己you,然后去寻找朋友中谁懂Neo4j:person->neo,然后寻找最短路径的:you-person即可达到目的。
不能用you直接关联neo,而是通过朋友,二度跳转到neo4j。
此时的(expert)->(neo)值得新手去理解一下,这里expert不是单独指定到某个人,而是指代所有WORKED_WITH neo的人。


参考文献:

Intro to Cypher
GraphGist: First Steps with Cypher

我的neo4j学习笔记

公众号“素质云笔记”定期更新博客内容:

neo4j︱Cypher 查询语言简单案例(二)相关推荐

  1. Redis简单案例(二) 网站最近的访问用户

    原文:Redis简单案例(二) 网站最近的访问用户 我们有时会在网站中看到最后的访问用户.最近的活跃用户等等诸如此类的一些信息.本文就以最后的访问用户为例, 用Redis来实现这个小功能.在这之前,我 ...

  2. Neo4j Cypher查询语言详解

    Cypher介绍 "Cypher"是一个描述性的图形查询语言,允许不必编写图形结构的遍历代码对图形存储有表现力和效率的查询.Cypher还在继续发展和成熟,这也就意味着有可能会出现 ...

  3. 【知识图谱】Neo4j Cypher查询语言详解

    Cypher 语法学习 Cypher 介绍 启动 Neo4j 基本类型 数值,布尔,字符串 节点和关系 列表 匹配语句 根据标签匹配节点 根据标签和属性匹配节点 匹配任意关系 可选匹配 过滤匹配 路径 ...

  4. neo4j︱Cypher完整案例csv导入、关系联通、高级查询(三)

    图数据库常规的有:neo4j(支持超多语言).JanusGraph/Titan(分布式).Orientdb,google也开源了图数据库Cayley(Go语言构成).PostgreSQL存储RDF格式 ...

  5. (三)Neo4j自带northwind案例--Cypher语言应用

    0.概述 通过该案例,应用Cypher查询语言,感受Neo4j套路.官方的用此案例的用意: The Northwind Graph demonstrates how to migrate(迁移) fr ...

  6. Cypher查询语言--Neo4j中的SQL

    Cypher查询语言--Neo4j中的SQL   转自:http://www.uml.org.cn/sjjm/201203063.asp   "Cypher"是一个描述性的图形查询 ...

  7. 读书笔记——Neo4j实战 Cypher查询语言

    Cypher是对图形的声明查询语言, 使用图形模式匹配作为主要的机制作图形数据选择(包括只读和变更操作) . Cypher的声明模式匹配性质意味着可以通过描述想从它那里得到什么查询图形数据. 执行Cy ...

  8. neo4j / cypher:悬挂查询参数

    一直以来,我一直在使用neo4j的密码查询语言, 迈克尔一直在告诉我在查询中使用参数,但是查询的性能始终可以接受,因此我没有必要. 但是,最近我正在研究一个数据集,并使用类似于以下的代码创建了约500 ...

  9. Neo4j安装及简单使用

    一.Neo4j和图数据库简介 neo4j是基于Java语言编写图形数据库.图是一组节点和连接这些节点的关系.图形数据库也被称为图形数据库管理系统或GDBMS. Neo4j的是一种流行的图形数据库. 其 ...

最新文章

  1. Effective Java:对于全部对象都通用的方法
  2. SpringBoot监听redis过期key
  3. java 抽象工厂工厂_Java设计模式之简单工厂、工厂方法和抽象工厂
  4. Spring 依赖注入(DI)
  5. PDF密码去除常用工具
  6. python 自动补全
  7. 数据结构作业1 讲解和拓展
  8. 源码详解Java的反射机制
  9. android初学之sharedpreferences存储
  10. 商业智能让营销更精确
  11. zabbix client安装配置执行
  12. 配音鸭 是什么 从哪儿进入 如何使用 手把手指南来了
  13. 关于数模中编程的一点愚见
  14. 传输线变压器设计原理
  15. Linux下3种常用的网络测速工具
  16. jquery 表单验证插件
  17. android apk很大,从Android Studio生成的Apk文件太大
  18. 借助栈实现单链表的原地逆置
  19. 运放电路的工作原理_一文教你巧识滤波、稳压、比较、运放电路
  20. 微信小程序插值语法和数组变量检测踩过的坑

热门文章

  1. navicat设置唯一键——unique
  2. [翻译]XNA在线俱乐部网站即将开站!
  3. iOS开发之注册推送通知权限
  4. python3处理大文件
  5. linux高亮 查日志
  6. Linux常用解压文件
  7. linux 5.4 安装php
  8. 移动端webapp开发基础
  9. 使用cronolog自动分割apache的日志。
  10. 2012、12、17