有没有什么组件可以在python里面调用Cypher语句?

2020-09-17 10:32发布

3条回答
卡卡
2楼 · 2020-09-18 10:06


参考博客 https://www.jianshu.com/p/2bb98c81d8ee

Cypher语句

Cypher是图形数据库Neo4j的声明式查询语言。Cypher语句规则和具备的能力:Cypher通过模式匹配图数据库中的节点和关系,来提取信息或者修改数据。Cypher语句中允许使用变量,用来表示命名、绑定元素和参数。Cypher语句可以对节点、关系、标签和属性进行创建、更新和删除操作。Cypher语句可以管理索引和约束。

运算符

常规运算DISTINCT,.,[]算数运算+,-,*,/,%,^比较运算=,<>,<,>,<=,>=,ISNULL,ISNOTNULL逻辑运算AND,OR,XOR,NOT字符串操作+List操作+,IN,[x],[x..y]正则操作=~字符串匹配STARTSWITH,ENDSWITH,CONTAINS

语句

  1. 创建节点语句

  2. 例子1:创建节点并给节点分配一个属性

  3. CREATE(n{name:"张三"})


例子2:批量创建节点并且分配属性

UNWIND[{name:"李四"},{name:"张三"}]ASmynodes

CREATE(n)SETn=mynodes


UNWIND[{name:"a"},{name:"b"}]ASp

CREATE(n:Test)

SETn=p

 

例3:创建节点时分配属性和标签

CREATE(n:Person{name:"李四"})



例4:创建一个关系,给两个节点建立关系指定关系类型、方向和绑定一个变量。

CREATE({name:"李四"})-[r:have]->({bookname:"设计模式"})



例5:创建两个节点同时创建一个关系,给两个节点建立关系指定关系类型、方向和属性。

CREATE({name:"李四"})-[:LOVES{since:"2017"}]->({name:"小花"})



例6:给已经存在的两个节点创建一个关系。

MATCH(a:Person),(b:Person)

WHEREa.name='张三'ANDb.name=李四'

CREATE(a)-[r:FRIEND]->(b)

RETURNr



2.匹配语句

Cypher的MATCH语句和SQL的SELECT语句类似,都是查询数据的表达式.而Cypher语句中的WHERE和SQL语句中的WHERE语句由这相同的作用,其作用是用来过滤匹配结的,在Cypher语句中WHERE是在MATCH、OPTIONALMATCH、WITH或START语句中使用的过滤限定语句

匹配语句结构[MATCHWHERE][OPTIONALMATCHWHERE][WITH[ORDERBY][SKIP][LIMIT]]RETURN[ORDERBY][SKIP][LIMIT]

例1:根据属性匹配节点信息。

MATCH(n{name:"张三"})RETURNn



例2:根据标签和属性匹配节点信息。

MATCH(n:Person{name:"李四"}})RETURNn




例3:任意匹配,返回任意节点信息。Cypher语句允许任意匹配,任意匹配可以匹配任何与cypher表达式相符合的所有节点.1.匹配任意节点

//该语句会匹配任意节点,并返回

MATCH(n)RETURNn


2.任意关系

//该语句是匹配出有任意关系的两个节点

MATCHp=(n)-[r]->(m)RETURNp


3.可选匹配

//匹配结果集中如果有丢的部分,则会用null来补充

OPTIONALMATCH(n)-[r]->(m)RETURNm



例4:匹配节点时指定标签、属性和关系类型

MATCH(n:Person)-[:FRIEND]->(m:Person)WHEREn.name='张三'



例5:根据标签过滤

//从图数据库中,过滤出Person标签

MATCH(n)WHEREn:PersonRETURNn



例6:根据节点属性过滤

MATCH(n)WHEREn.name="李思思"RETURNn



例7:根据关系属性过滤

MATCH(n)-[k:KNOWS]->(f)WHEREk.since<2000returnf>



例8:字符串匹配

字符串首尾可以使用STARTSWITH和ENDSWITH,去匹配定位字符串,字符串匹配还可以使用AONTAINS来匹配字符串中包含的自字符串。1.匹配字符串的开头匹配图中的所有节点,返回节点中包含name属性,且属性值以"张"开头的所有节点

MATCH(n)

WHEREn.nameSTARTSWITH'张'

RETURNn


2.匹配字符串的末尾匹配图中的所有节点,返回节点中包含name属性,且属性值以"三"开头的所有节点

MATCH(n)

WHEREn.nameENDSWITH'三'

RETURNn


3.匹配字符串的包含匹配匹配图中的所有节点,返回节点中包含name属性,且属性值中任意位置包含"小"字符串的节点

MATCH(n)

WHEREn.nameCONTAINS'三'

RETURNn


4.字符串排除匹配在字符串匹配的时候可以使用NOT关键字来排除匹配到的结果,得到相反的结果

//匹配图中的所有节点,返回节点中包含name属性,且不是姓张的所有节点

MATCH(n)

WHERENOTn.nameSTARTSWITH'张'

RETURNn



例9:字符串正则表达式

Cypher支持使用正则表达式进行过滤。正则表达式语法从Java正则表达式继承过来的。这包括支持改变字符串匹配的标志,包括不区分大小写(?i),多行(?m)和逗点(?s),在这里正则表达式使用的解析符号是=~。

  1. 模糊匹配,类似sql语句中的like

  2. //类似like'%小%'

MATCH(n)

WHEREn.name=~'.*小.*'

RETURNn


2.不去分大小写正则匹配

//不区分大小写匹配,名字中以"ANDR"开头的节点

MATCH(n)

WHEREn.name=~'(?i)ANDR.*'

RETURNn



例10:WHERE句子中使用路径匹配

  1. 使用逻辑运算符号和路径作为过滤条件

  2. //在图中匹配名称为"李四"或"王五"与"张三"有任何关系的节点,并返回符合匹配条件的节点信息

  3. MATCH(n{name:'张三'}),(m)

  4. WHEREm.nameIN['李四','王五']AND(n)<--(m)

  5. RETURNm

2.关系匹配使用NOT逻辑运算符号

//匹配和张三没有关系的人

MATCH(persons),(zhangsan{name:'张三'})

WHERENOT(persons)-->(zhangsan)

RETURNpersons


3.关系类型匹配,并使用正则表达式

//在图中匹配张三节点和所有节点的关系类型以F开头的所有关系

MATCH(n)-[r]->()

WHEREn.name='张三'ANDtype(r)=~'F.*'

RETURNr



例11:使用"或"逻辑匹配关系

//返回任意关系为KNOWS和LOVES的所有节点关系

MATCHp=(n)-[:KNOWS|:LOVES]->(m)RETURNp



例12:关系深度匹配

  1. 匹配从n到m,任意关系,深度1到5的节点

  2. MATCHp=(n)-[*1..5]->(m)RETURNp

2.匹配从n到m,任意关系、任意深度的节点

MATCHp=(n)-[*]->(m)RETURNp



例13:匹配分页返回

MATCH(n)WHEREn.productName='苹果'RETURNnSKIP10LIMIT10



例14:匹配去重返回

MATCH(n)WHEREn.productName='苹果'RETURNDISTINCTn



例15:匹配分组返回值

MATCH(n)WHEREn.productName='苹果'RETURNnORDERBYn.priceDESC



例16:别名返回

MATCH(n)WHEREn.productName=~'.*苹果.*'RETURNn.productNameASname



例17:WITH语句使用使用示例

WITH语句是将第一部分匹配的输出作为下一部分匹配的输入。1.查找有十个以上朋友的张姓男子

MATCH(user)-[:FRIEND]-(friend)

WHEREuser.name=~'张.*'

WITHuser,count(friend)ASfriends

WHEREfriends>10

RETURNuser


2.WITH语句中使用ORDERBY、SKIP和LIMIT语句示例。

MATCH(user)-[:FRIEND]-(friend)

WITHuser,count(friend)ASfriends

ORDERBYfriendsDESC

SKIP1

LIMIT3

RETURNuser



例18:UNION语句使用使用示例

  1. 使用UNION结果去重,求并集

  2. MATCH(a)-[:KNOWS]->(b)

  3. RETURNb.name

  4. UNION

  5. MATCH(a)-[:LOVES]->(b)

  6. RETURNb.name

2.使用UNIONALL结果不去重,求和集

MATCH(a)-[:KNOWS]->(b)

RETURNb.name

UNIONALL

MATCH(a)-[:LOVES]->(b)

RETURNb.name



例19:start语句匹配节点信息

  1. 匹配所有节点

  2. STARTn=node(*)RETURNn

2.根据节点的具体id匹配

//在node函数中的值,是节点在图中的id

STARTn=node(1)RETURNn


3.节点更新和删除

例1:更新和添加一个属性

//1.创建一个节点,只有一个属性name='张三'

CREATE({name:'张三'})


//2.给创建的"张三"节点,添加一个属性age=20,修改name属性值为"李四"

MATCH(n{name:'张三'})

SETn.name='李四'

SETn.age=20

RETURNn



例2:修改节点信息,覆盖节点属性

//该语句会直接删除掉name属性,新增age属性

MATCH(n{name:'张三'})

SETn={age:20}



例3:修改节点信息,新增节点属性

//该语句不会删除掉name属性,而是在节点中新增age属性

MATCH(n{name:'张三'})SETn+={age:20}RETURNn


UNWIND[{age:30},{addr:"sz"}]ASProp

MERGE(n:Test{name:"b"})

SETn+=prop


例4:删除节点属性

MATCH(n{name:'张三'})removen.ageRETURNn



例5:为节点添加新标签

//添加一个标签

MATCH(n{name:'张三'})SETn:PersonRETURNn

//添加多个标签

MATCH(n{name:'张三'})SETn:Person:StudentRETURNn



例6:删除节点标签

MATCH(n{name:'张三'})REMOVEn:PersonRETURNn



例7:为已经存在的两个节点添加关系


MATCH(a:Person{name:"张三"}),

(b:Person{name:"李四"})

MERGE(a)-[r:FRIENDS]->(b)



例8:匹配一个节点,更新属性如果属性不存在则创建该属性

MERGE(n:Person{name:"张三"})

ONCREATESETn.created=timestamp()

ONMATCHSET

n.counter=coalesce(n.counter,0)+1,

n.accessTime=timestamp()



例9:匹配一个节点为他创建一个新的关系

//如果没有"王五"节点则创建一个新的

MATCH(a:Person{name:"张三"})

MERGE

(a)-[r:KNOWS]->(b:Person{name:"王五"})



例10:删除一个节和关系

MATCH(a)-[r:KNOWS]->(b)DELETEr,b


例11:级联删除

//删除"王五"节点之后,将与王五节点建立关系也删除掉

MATCH(n{name:"王五"})DETACHDELETEn


 例12:使用Foreach循环创建多个节点

WITH["a","b","c"]AScollFOREACH(valueinroll|CREATE(:Person{name:value}))

4.索引和约束

例1:创建索引

//为"Person"标签的name属性创建索引

CREATEINDEXON:Person(name)



例2:删除索引

//删除"Person"标签的name属性的索引

DROPINDEXON:Person(name)



例3:匹配条件中使用索引

MATCH(n:Person)

WHEREn.name='Andres'

RETURNn



例4:创建节点属性唯一约束

创建一个唯一约束保证图数据库中同一个标签内的节点的属性值不重复。注意:不可以为已经创建索引的属性创建唯一约束

CREATECONSTRAINTON(n:Person)ASSERTn.nameISUNIQUE


例5:创建节点属性唯一约束

DROPCONSTRAINTON(n:Person)ASSERTn.nameISUNIQUE

5.函数

谓词函数:all(),any(),none(),single(),exists()

称量函数:size(),length(),type(),id(),coalesce(),head(),last(),timestamp(),startNode(),endNode(),properties(),toInt(),toFloat()

列表函数:nodes(),relationships(),labels(),keys(),extract(),filter(),tail(),range(),reduce()

字符串函数:replace(),substring(),left(),right(),ltrim(),rtrim(),trim(),lower(),upper(),reverse(),toString()

数学函数:abs(),ceil(),floor(),round(),sign(),rand()

6.使用CALL调用存储过程

使用关键字CALL调用了存储过程dbms.procedures(),列出系统可用的存储过程列表

CALLdbms.procedures()

使用db.labels()存储过程查询数据库中可用的标签

CALLdb.labels()YIELDlabel

RETURNlabel


7.查询语句性能分析

查询属性name等于“观众40”的节点

PROFILEMATCH(p:Person{name:"观众40"})RETURNp

使用节点的name属性作为查询条件,再为name属性增加一个唯一属性约束

CREATECONSTRAINTON(p:Person)

ASSERTp.nameISUNIQUE

在创建约束后,将会同时创建索引,再次使用查询语句:

PROFILEMATCH(p:Person{name:"观众40"})RETURNp

加上索引后,查询性能又提高了,不用从整个标签中搜索节点,从属性的索引中直接就得到了查找的记录。

未加标签时,查询性能是最差的,将对整个数据库的所有节点进行检索;加上标签后,缩小了检索的范围,明显提高了查询性能;使用属性进行查询,加上索引后,查询性能又进一步提升了。

 

 

 

 


给你三个亿
3楼 · 2020-09-21 14:34



Cypher是一种图数据库查询语言,表现力丰富,查询效率高,其地位和作用与关系型数据库中的SQL语言相当。

Cypher具备的能力:

Cypher通过模式匹配图数据库中的节点和关系,来提取信息或者修改数据。Cypher语句中允许使用变量,用来表示命名、绑定元素和参数。Cypher语句可以对节点、关系、标签和属性进行创建、更新和删除操作。Cypher语句可以管理索引和约束。

Cypher的简单语法:

1、节点语法:采用一对圆括号来表示节点。如:()、(foo)2、关系语法:使用一对短横线表示无方向关系,有方向加箭头。如:-[role]-、-[:ACTED_IN]->、-[role:ACTED_IN]->3、模式语法:将节点和关系的语法组合在一起可以表达模式。如:(keanu:Person:Actor{name:"KeanuRteves"}-[role:ACTED_IN{roles:["Neo"]}]->{matrix:Movie{title:"TheMatrix"}})

Cypher处理值支持的类型:

数值、字符串、布尔、节点、关系、路径、映射Map、列表List

Cypher查询语言中的所有函数:

断言(Predicate)函数、标量(Scalar)函数、列表(List)函数、数学(Math)函数、字符串(String)函数、自定义函数

Neo4j程序开发模式:

Java嵌入式开发模式,Java开发人员完全可以直接在代码中调用Neo4j的API,并将对Neo4j数据库的操作嵌入到Java代码中;驱动开发模式,使用.net、JavaScript、Python、php等集成的驱动包或驱动库就可以与Neo4j相互对话

常用的语句

  1. 创建节点语句

  2. CREATE(n{name:"张三"})//创建节点并给节点分配一个属性

  3. CREATE({name:"李四"})-[r:have]->({bookname:"设计模式"})//创建一个关系,给两个节点建立关系指定关系类型、方向和绑定一个变量

  4. 2.查询语句

  5. MATCH(n{name:"张三"})RETURNn//根据属性匹配节点信息

  6. MATCH(n:Person)-[:FRIEND]->(m:Person)WHEREn.name='张三'//匹配节点时指定标签、属性和关系类型

  7. MATCH(n)-[k:KNOWS]->(f)WHEREk.since<2000RETURNf>

  8. 3.节点更新和删除

  9. MATCH(n{name:'张三'})SETn={age:20}//修改节点信息,覆盖节点属性

  10. MATCH(n{name:'张三'})SETn+={age:20}RETURNn//该语句不会删除掉name属性,而是在节点中新增age属性

  11. MATCH(n{name:'张三'})removen.ageRETURNn//删除节点属性

  12. MATCH(a)-[r:KNOWS]->(b)DELETEr,b//删除一个节和关系

  13. 4.索引和约束

  14. CREATEINDEXON:Person(name)//为"Person"标签的name属性创建索引

  15. DROPCONSTRAINTON(n:Person)ASSERTn.nameISUNIQUE//创建节点属性唯一约束

  16. 参考资料

  17. Neo4jCypher查询语言详解Neo4j之Cypher学习总结


相关问题推荐

  • 回答 3

    换行。比如,print hello\nworld效果就是helloworld\n就是一个换行符。\是转义的意思,&#39;\n&#39;是换行,&#39;\t&#39;是tab,&#39;\\&#39;是,\ 是在编写程序中句子太长百,人为换行后加上\但print出来是一整行。...

  • 回答 42

    十种常见排序算法一般分为以下几种:(1)非线性时间比较类排序:a. 交换类排序(快速排序、冒泡排序)b. 插入类排序(简单插入排序、希尔排序)c. 选择类排序(简单选择排序、堆排序)d. 归并排序(二路归并排序、多路归并排序)(2)线性时间非比较类排序:...

  • 回答 70
    已采纳

    前景很好,中国正在产业升级,工业机器人和人工智能方面都会是强烈的热点,而且正好是在3~5年以后的时间。难度,肯定高,要求你有创新的思维能力,高数中的微积分、数列等等必须得非常好,软件编程(基础的应用最广泛的语言:C/C++)必须得很好,微电子(数字电...

  • 回答 28

    迭代器与生成器的区别:(1)生成器:生成器本质上就是一个函数,它记住了上一次返回时在函数体中的位置。对生成器函数的第二次(或第n次)调用,跳转到函数上一次挂起的位置。而且记录了程序执行的上下文。生成器不仅记住了它的数据状态,生成器还记住了程序...

  • 回答 9

    python中title( )属于python中字符串函数,返回’标题化‘的字符串,就是单词的开头为大写,其余为小写

  • 回答 6

    第一种解释:代码中的cnt是count的简称,一种电脑计算机内部的数学函数的名字,在Excel办公软件中计算参数列表中的数字项的个数;在数据库( sq| server或者access )中可以用来统计符合条件的数据条数。函数COUNT在计数时,将把数值型的数字计算进去;但是...

  • 回答 1

    head是方法,所以需要取小括号,即dataset.head()显示的则是前5行。data[:, :-1]和data[:, -1]。另外,如果想通过位置取数据,请使用iloc,即dataset.iloc[:, :-1]和dataset.iloc[:, -1],前者表示的是取所有行,但不包括最后一列的数据,结果是个DataFrame。...

  • Python入门简单吗2021-09-23 13:21
    回答 45

    挺简单的,其实课程内容没有我们想象的那么难、像我之前同学,完全零基础,培训了半年,直接出来就工作了,人家还在北京大公司上班,一个月15k,实力老厉害了

  • 回答 4

    Python针对众多的类型,提供了众多的内建函数来处理(内建是相对于导入import来说的,后面学习到包package时,将会介绍),这些内建函数功用在于其往往可对多种类型对象进行类似的操作,即多种类型对象的共有的操作;如果某种操作只对特殊的某一类对象可行,Pyt...

  • 回答 8

     相当于 ... 这里不是注释

  • 回答 4

    还有FIXME

  • 回答 3

    python的两个库:xlrd和xlutils。 xlrd打开excel,但是打开的excel并不能直接写入数据,需要用xlutils主要是复制一份出来,实现后续的写入功能。

  • 回答 8

    单行注释:Python中的单行注释一般是以#开头的,#右边的文字都会被当做解释说明的内容,不会被当做执行的程序。为了保证代码的可读性,一般会在#后面加一两个空格然后在编写解释内容。示例:#  单行注释print(hello world)注释可以放在代码上面也可以放在代...

  • 回答 2

    主要是按行读取,然后就是写出判断逻辑来勘测行是否为注视行,空行,编码行其他的:import linecachefile=open(&#39;3_2.txt&#39;,&#39;r&#39;)linecount=len(file.readlines())linecache.getline(&#39;3_2.txt&#39;,linecount)这样做的过程中发现一个问题,...

  • 回答 4

    或许是里面有没被注释的代码

  • 回答 26

    自学的话要看个人情况,可以先在B站找一下视频看一下

没有解决我的问题,去提问