目录

  1. 操作符
  2. 参数
  3. 标识符
  4. 注解
  5. Start
    1. 通过id绑定点
    2. 通过id绑定关系
    3. 通过id绑定多个节点
    4. 所有节点
    5. 通过索引查询获取节点
    6. 通过索引查询获取关系
    7. 多个开始点

    Cypher是一个描述性的图形查询语言,允许不必编写图形结构的遍历代码对图形存储有表现力和效率的查询。Cypher还在继续发展和成熟,这也就意味着有可能会出现语法的变化。同时也意味着作为组件没有经历严格的性能测试。

Cypher设计的目的是一个人类查询语言,适合于开发者和在数据库上做点对点模式(ad-hoc)查询的专业操作人员(我认为这个很重要)。它的构念是基于英语单词和灵巧的图解。

Cyper通过一系列不同的方法和建立于确定的实践为表达查询而激发的。许多关键字如like和order by是受SQL的启发。模式匹配的表达式来自于SPARQL。正则表达式匹配实现实用Scala programming language语言。

Cypher是一个申明式的语言。对比命令式语言如Java和脚本语言如Gremlin和JRuby,它的焦点在于从图中如何找回(what to retrieve),而不是怎么去做。这使得在不对用户公布的实现细节里关心的是怎么优化查询。

这个查询语言包含以下几个明显的部分:

Ø  START:在图中的开始点,通过元素的ID或所以查找获得。

Ø  MATCH:图形的匹配模式,束缚于开始点。

Ø  WHERE:过滤条件。

Ø  RETURN:返回所需要的。

在下例中看三个关键字

示例图片如下:

如:这个有个查询,通过遍历图找到索引里一个叫John的朋友的朋友(不是他的直接朋友),返回John和找到的朋友的朋友。

START john=node:node_auto_index(name = 'John')

MATCH john-[:friend]->()-[:friend]->fof

RETURN john, fof

返回结果:

下一步添加过滤:

在下一个例子中,列出一组用户的id并遍历图查找这些用户接出friend关系线,返回有属性name并且其值是以S开始的用户。

START user=node(5,4,1,2,3)

MATCH user-[:friend]->follower

WHERE follower.name =~ /S.*/

RETURN user, follower.name

返回结果:

操作符

Cypher中的操作符有三个不同种类:数学,相等和关系。

数学操作符有+,-,*,/和%。当然只有+对字符有作用。

等于操作符有=,<>,<,>,<=,>=。

因为Neo4j是一个模式少的图形数据库,Cypher有两个特殊的操作符?和!。

有些是用在属性上,有些事用于处理缺少值。对于一个不存在的属性做比较会导致错误。为替代与其他什么做比较时总是检查属性是否存在,在缺失属性时问号将使得比较总是返回true,感叹号使得比较总是返回false。

WHEREn.prop? = "foo"

这个断言在属性缺失情况下将评估为true。

WHEREn.prop! = "foo"

这个断言在属性缺失情况下将评估为false。

警告:在同一个比较中混合使用两个符号将导致不可预料的结果。

参数

Cypher支持带参数的查询。这允许开发者不需要必须构建一个string的查询,并且使得Cypher的查询计划的缓存更容易

参数可以在where子句,start子句的索引key或索引值,索引查询中作为节点/关系id的引用。

以下是几个在java中使用参数的示例:

节点id参数

Map<String, Object> params = new HashMap<String, Object>();

params.put( "id", 0 );

ExecutionResult result = engine.execute( "start n=node({id}) return n.name", params );

节点对象参数

Map<String, Object> params = new HashMap<String, Object>();

params.put( "node", andreasNode );

ExecutionResult result = engine.execute( "start n=node({node}) return n.name", params );

多节点id参数

Map<String, Object> params = new HashMap<String, Object>();

params.put( "id", Arrays.asList( 0, 1, 2 ) );

ExecutionResult result = engine.execute( "start n=node({id}) return n.name", params );

字符串参数

Map<String, Object> params = new HashMap<String, Object>();

params.put( "name", "Johan" );

ExecutionResult result = engine.execute( "start n=node(0,1,2) where n.name = {name} return n", params );

索引键值参数

Map<String, Object> params = new HashMap<String, Object>();

params.put( "key", "name" );

params.put( "value", "Michaela" );

ExecutionResult result = engine.execute( "start n=node:people({key} = {value}) return n", params );

索引查询参数

Map<String, Object> params = new HashMap<String, Object>();

params.put( "query", "name:Andreas" );

ExecutionResult result = engine.execute( "start n=node:people({query}) return n", params );

  • SKIP 与LIMIT * 的数字参数

Map<String, Object> params = new HashMap<String, Object>();

params.put( "s", 1 );

params.put( "l", 1 );

ExecutionResult result = engine.execute( "start n=node(0,1,2) return n.name skip {s} limit {l}", params );

  • 正则表达式参数

Map<String, Object> params = new HashMap<String, Object>();

params.put( "regex", ".*h.*" );

ExecutionResult result = engine.execute( "start n=node(0,1,2) where n.name =~ {regex} return n.name", params );

标识符

当你参考部分的模式时,需要通过命名完成。定义的不同的命名部分就被称为标识符。

如下例中:

START n=node(1) MATCH n-->b RETURN b

标识符为n和b。

标识符可以是大写或小些,可以包含下划线。当需要其他字符时可以使用`符号。对于属性名的规则也是一样。

注解

可以在查询语句中使用双斜杠来添加注解。如:

START n=node(1) RETURN b //这是行结束注释

START n=node(1) RETURN b

START n=node(1) WHERE n.property = "//这部是一个注释" RETURN b

Start

每一个查询都是描述一个图案(模式),在这个图案(模式)中可以有多个限制点。一个限制点是为模式匹配的从开始点出发的一条关系或一个节点。可以通过id或索引查询绑定点。

通过id绑定点

通过node(*)函数绑定一个节点作为开始点

查询:

START n=node(1)

RETURN n

返回引用的节点。

结果:

通过id绑定关系

可以通过relationship()函数绑定一个关系作为开始点。也可以通过缩写rel()。

查询:

START r=relationship(0)

RETURN r

Id为0的关系将被返回

结果:

通过id绑定多个节点

选择多个节点可以通过逗号分开。

查询:

START n=node(1, 2, 3)

RETURN n

结果:

所有节点

得到所有节点可以通过星号(*),同样对于关系也适用。

查询:

START n=node(*)

RETURN n

这个查询将返回图中所有节点。

结果:

通过索引查询获取节点

如果开始节点可以通过索引查询得到,可以如此来写:

node:index-name(key=”value”)。在此列子中存在一个节点索引叫nodes。

查询:

START n=node:nodes(name = "A")

RETURN n

索引中命名为A的节点将被返回。

结果:

通过索引查询获取关系

如果开始点可以通过索引查询得到,可以如此做:

Relationship:index-name(key=”value”)。

查询:

START r=relationship:rels(property ="some_value")

RETURN r

索引中属性名为”some_value”的关系将被返回

结果:

多个开始点

有时需要绑定多个开始点。只需要列出并以逗号分隔开。

查询:

START a=node(1), b=node(2)

RETURN a,b

A和B两个节点都将被返回。

结果:

Cypher查询语言--Neo4j 入门 (一)的更多相关文章

  1. Cypher查询语言--Neo4j 之高级篇 (六)

    目录 排序Order by 通过节点属性排序节点 通过多节点属性排序节点 倒序排列节点 空值排序 Skip 跳过前三个 返回中间两个 Limit 返回第一部分 函数Functions 判断 All A ...

  2. Cypher查询语言--Neo4j之聚合函数(五)

    目录 聚合Aggregation 计数 计算节点数 分组计算关系类型 计算实体数 计算非空可以值数 求和sum 平均值avg 最大值max 最小值min 聚类COLLECT 相异DISTINCT 聚合 ...

  3. Cypher查询语言--Neo4j 综合(四)

    目录 返回节点 返回关系 返回属性 带特殊字符的标识符 列的别名 可选属性 特别的结果   查询中的返回部分,返回途中定义的感兴趣的部分.可以为节点.关系或其上的属性. 图 返回节点 返回一个节点,在 ...

  4. Neo4j入门详细教程

    Neo4j安装配置 (1)下载安装包 (2)安装jdk (3)环境变量配置 分三步,具体参考  https://www.bilibili.com/video/BV1Nz411q7bG?from=sea ...

  5. Neo4j入门博客分享

    Neo4j学习参考博客:https://www.cnblogs.com/ljhdo/p/5516793.html Neo4j Cypher查询语言详解 http://www.ttlsa.com/nos ...

  6. CYPHER 语句(Neo4j)

    CYPHER 语句(Neo4j) 创建电影关系图 新增 查找 修改 删除 导入 格式转换 创建电影关系图 CREATE (TheMatrix:Movie {title:'The Matrix', re ...

  7. Neo4j Cypher查询语言详解

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

  8. Neo4j入门之中国电影票房排行浅析

    什么是Neo4j?   Neo4j是一个高性能的NoSQL图形数据库(Graph Database),它将结构化数据存储在网络上而不是表中.它是一个嵌入式的.基于磁盘的.具备完全的事务特性的Java持 ...

  9. Neo4j入门-开始使用

    前言 关系,指事物之间相互作用.相互影响的状态. 数据之间的关系也是如此,数据之间关系的存储在RDS就已经开始.从数据库支持的外键,到手动建立的关系表,人们采取了许多方法,只为了解决查询复杂.缓慢等问 ...

随机推荐

  1. LoadRunner 中实现MD5加密

    最近在用loadrunner做一个压力测试,在编写脚本的时候发现传递参数的时候需要一个sign值,这个值是将参数进行MD5加密生成的,所以下面就说一说怎么对参数进行MD5加密. 1.首先我们需要一个加 ...

  2. 洛谷 P1598 垂直柱状图【字符串+模拟】

    P1598 垂直柱状图 题目描述 写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过72个字符),然后用柱状图输出每个字符在输入文件中出现的次数.严格地按照输出样例来安排你的输出格式. ...

  3. isdigit函数

    isdigit是计算机应用C语言中的一个函数,主要用于检查参数c是否为阿拉伯数字0到9. 相关函数 isdigit 表头文件 #include <ctype.h>(C语言),#includ ...

  4. HDU 3377 Plan

    Problem Description One day, Resty comes to an incredible world to seek Eve -- The origin of life. L ...

  5. Java应用开发中的字符集与字符编码

    事出有因 在向HttpURLConnection的输出流写入内容时,因没有设置charset,导致接收方对数据的验签不一致. URL url = new URL(requestUrl); //打开连接 ...

  6. Eclipse安装svn插件的几种方式 转帖....

    Eclipse安装svn插件的几种方式 1.在线安装: (1).点击 Help --> Install New Software... (2).在弹出的窗口中点击add按钮,输入Name(任意) ...

  7. asp.net网站管理工具 遇到错误。请返回上一页并重试。

    原因:项目的路径里有“#”号.

  8. 配置国内PIP源方法

    python开发者都知道,当我们pip install安装扩展库的时候,经常遇到安装失败(超时)等,有时候是因为国外镜像被屏蔽了,带来不少麻烦, 随着国内python开发的增多,越来越多企业都开放了自 ...

  9. Bad Request (Invalid Hostname)什么意思? 200

    一般来说与你电脑无关 错误请求(无效主机名) 域名已绑定主机 但主机未绑定域名就会出现这种情况! 总结页面出现Bad Request (Invalid Hostname)的原因: 1.如果确定域名已经 ...

  10. CSS3 background-size 属性

    定义和用法 background-size 属性规定背景图像的尺寸. 默认值: auto 继承性: no 版本: CSS3 JavaScript 语法: object.style.background ...