• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Neo4j入门点滴(一):Cypher

Neo4j入门点滴(一):Cypher

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了neo4j cypher,neo4j入门教程,neo4j,neo4j教程,neo4j官网等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Neo4j入门点滴(一):Cypher


Cypher,读作(赛佛儿)。名词意为:零,零的记号,或密码索引书;动词含义为计算或用密码书写。不过,更准确的引申要从街舞中借鉴,在街舞中,Cypher就是围圈跳舞,不分先后,没有对手,就是一次一次即兴的到中间去跳。在社会网络分析(SNA)中,Neo4j的核心实现形式语言就是功能类似这种围圈舞蹈的Cypher。
Cypher我理解是一种联系操作语言,之所以将其称为“联系”就是要使之和传统SQL数据库的“关系”相区分。操作对象即图数据库独有的节点(Nodes)、标签(Labels)、联系(Relationships)和属性(Properties)。解释一下,以便理解的更为深入:
  • Node:表征实体,如:人、公司、账户或其他类似的东西。
  • Label:标签不是一开始就有的,后续更新的版本加入了这个功能,极为好用。因为人脑的两种基本认知方式之一就是分类,而标签就是最佳的方法。标签用于标识Node的类别,一个节点可拥有一个或多个标签。标签有助于创建索引,加速检索。
  • Relationship:联系定义了两个Node之间的连接。联系还可以有自己的属性和方向。
  • Property:用于存储Node的相关信息,是Node的内涵定义。属性可以被Node和Relationship拥有,一如Node一样,Property也是一种广泛而基本的存在。
为了更深入地理解Cypher的语法,需要提前说明一下Cypher查询的执行过程:
  1. 首先,进行语法解析、正确性检查、产生执行计划;
  2. 其次,定位至初始节点;
  3. 再次,选择和遍历联系;
  4. 最后,更改或返回值。
后续语法的执行基本上都是这四个步骤的不断重复。

一、基本语法(CURD):
1. Create
试着创建一个Node,这个节点是一个人--顾双双,是我心理咨询的一个来访者,性别女,年龄23。仿照基本格式先写一个:
  1. create (顾双双:患者{gender:"女",age:"23"})
请注意在下图的结果中,标签是“患者”,节点当前显示的名字是第一个标签的内容“女”:
当然了,这和我的本意并不相符,我是打算创建姓名为“顾双双”的患者,希望姓名可以在Node中心显示出来。所以,现在CREATE的格式是:create (?:标签名{属性名1:"属性1值",属性名2:"属性2值"}),所以现在主要的问题是弄清楚“?”代表什么,或者这个部分是否可以省略。
弄清楚了:?代表的是创建的本实例,正规的一个格式是:
  1. create (n:患者{gender:"女",age:23})
注意两点,第一是n,第二是23旁边没有括号了,也就意味着该值不是字符型而是数值型。n实际上是可有可无的,用于捕获create的结果,可以有也可以没有。故而,“n:患者”也可以写成“:患者”,结果是一样的。
好了,另一个与Create齐名的语法也必须介绍了,这就是:merge,非常非常重要。Merge好似if-else语句,基本逻辑是先检测merge后面的条件,看看有没有匹配的返回值,如果有则执行on merge分支,如果没有则走on create。逻辑很简单,humane:看是否需要merge,找到的话就合并,没找到就新建。
首先,merge条件部分可以单独执行,不过意义不大:
还是用例子说明:
  1. merge (x:患者{gender:"男"})
  2. on match set x.name = "小明", x.birthday = 2007/06/02
  3. on create set x.created_time = timestamp()
结果如图,虽然执行成功:
但年龄还是有问题:
到stackOverFlow上找了一下,都说需要手工将时间转成timestamp,因为Neo4j只有一个timestamp()函数而且还没有参数,很多人在抱怨这个问题,估计官方日后一定会增强这方面的功能。
执行了如下语句后,激活了On create分支,因为数据库中目前并没有 性别是“P”的患者:
  1. merge (x:患者{gender:"P"})
  2. on match set x.name = "小明", x.birthday = "2007/06/02"
  3. on create set x.created_time = timestamp()
结果如图:


2. Update
更新的操作实际上是由set命令完成的,首先要定位到待修改的节点或联系,然后进行修改。举个例子:
  1. match (x:患者) where x.gender="男" set x.age=100 return x
这个例子说明不仅可以使用set更改值,还可以更改值类型,比如从string改为integer。

3. Retrieve
实际上,查询或检索这一操作是Cypher实际应用中使用次数最频繁的,类似SQL数据库中的SELECT。在Neo4j中,主要是由Match及其后续限定的Where从句构成。
比如,通过如下语句新增一个节点,现在数据库中有一男一女两个节点:
  1. create (:患者{gender:"男",age:"23"})
输入如下语句,返回标签为“患者”的所有节点(当前是两个):
  1. match(x:患者) return x
输入如下语句,返回标签为“患者”并且性别为“女”的所有节点(当前是一个):
  1. match (x:患者) where x.gender="女" return x
Where从句的语法和SQL非常相似,比如is not null或者=,之间还可以使用and、or等逻辑运算符进行组合。并且,除了Create和Delete语句,其他所有语句都应该以return结尾,否则报错。
还有一个就是Optional Match,其他都一样,差别在于没找到Match不返回任何结果,而Optional Match返回NULL,如下图的“records”所示:
在Match查找前,可以进行定位以加快检索速度和效率。一般而言,Cypher语句以Start开始,每一条查询语句可以有多个起始点(starting points),借助start可以制定Legacy index,虽然这个东东现在已经被schema取代了,但为了后向兼容还是保留了基本功能,如下例所示:
  1. start n = node:nodesIndx (Gender = "男") return n
然而,实际应用中,还有一个重要的检索功能必须掌握,那就是所谓的“Aggregation”。这种聚合实质上是grouping,就是对结果进行统计操作,小到count、max、min,大到stdev、stdevp,更不用说distinct了。比如将之前的例子的返回值加一个count:
  1. match (x:患者) where x.gender="女" return count(x)
结果是1,如下图所示:
OK,another trick,使用distinct:
  1. match (x:患者) where x.age="23" return count(distinct x.gender)
结果如下,返回2,但如果是x.age则只是1啦:
查询部分先总结到这儿。

4. Delete
删除任何东西都可以使用Delete,但将上述创建的所有内容一口气删除,不能使用:
  1. match (n)
  2. delete n
而应该使用:
  1. match (n)
  2. detach delete n
因为使用第一种方式,会报错:“Cannot delete node<34>, because it still has relationships.”。究其原因,在于高版本的Neo4j加强了数据保护,对于有联系的节点,需要先删除联系再删除节点。然而,使用detach便开启了弱保护机制。
但是,还有个好用的东东叫remove,专门用来删除属性和标签,比delete安全一些。比如:
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Neo4j入门点滴(一):Cypher

相关文章

  • 2017-05-26Apache Cordova开发Android应用程序——番外篇,cordovaandroid
  • 2017-05-26在Android Studio中安装OpenCV mac环境/Linux环境
  • 2017-05-26Android热补丁动态修复实践
  • 2017-05-26Android 旋转屏幕--处理Activity与AsyncTask的最佳解决方案,androidasynctask
  • 2017-05-26Android MeasuerSpce的由来及使用
  • 2017-05-26GCM(Google Cloud Messaging)推送完全解析,gcmmessaging
  • 2017-05-26Android小知识,理财小知识
  • 2017-05-26Android-绘制爱心,android-绘制
  • 2017-05-26Android线程操作对象AsyncTask线程机制
  • 2017-05-26Mobizen免帐号版,Mobizen帐号版

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 几个常用的adb命令,常用adb命令
    • Kotlin中功能操作与集合(KAD 11),
    • 2.5.5 ExpandableListView(可折叠列表)的基本使用
    • 解决CentOS 7 history命令不显示操作记录的时间和用户身份问题
    • android:ScrollView监视什么时候滑到底部
    • Fragment,androidfragment
    • 我的Android进阶之旅------)Android自定义View实现带数字的进度条(NumberProgressBar)
    • Android7.0 Phone应用源码分析(三) phone拒接流程分析,android7.0拒接
    • Android开发学习之路--RxAndroid之lambda
    • App单个页面的最佳文本框个数是多少个?,app文本框个数

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有