cypher语言的使用

官方文档手册

Introduction - Neo4j Cypher Manual

cypher是一种声明性图形查询语言。

如果缺少练习用的数据,可以使用下面的创建语句创建一个明星关系的图来进行练习。

CREATE (陈冠希:明星 {名称: "陈冠希"}), (王菲:明星 {名称: "王菲"}), (李亚鹏:明星 {名称: "李亚鹏"}), (瞿颖:明星 {名称: "瞿颖"}), (张柏芝:明星 {名称: "张柏芝"}), (谢霆锋:明星 {名称: "谢霆锋"}), (周迅:明星 {名称: "周迅"}), (张亚东:明星 {名称: "张亚东"}), (窦唯:明星 {名称: "窦唯"}), (窦鹏:明星 {名称: "窦鹏"}), (李大齐:明星 {名称: "李大齐"}), (朴树:明星 {名称: "朴树"}), (窦颖:明星 {名称: "窦颖"}), (梁朝伟:明星 {名称: "梁朝伟"}), (刘嘉玲:明星 {名称: "刘嘉玲"}), (周迅)-[:旧爱]->(窦鹏), (周迅)-[:旧爱]->(李大齐), (周迅)-[:旧爱]->(朴树), (周迅)-[:旧爱]->(李亚鹏), (周迅)-[:绯闻]->(梁朝伟), (周迅)-[:绯闻]->(谢霆锋), (王菲)-[:离异]->(李亚鹏), (王菲)-[:旧爱]->(谢霆锋), (王菲)-[:离异]->(窦唯), (谢霆锋)-[:旧友]->(陈冠希), (谢霆锋)-[:离异]->(张柏芝), (张亚东)-[:制作人]->(朴树), (张亚东)-[:离异]->(窦颖), (张亚东)-[:制作人]->(王菲), (李亚鹏)-[:旧爱]->(瞿颖), (陈冠希)-[:旧爱]->(张柏芝), (瞿颖)-[:旧爱]->(张亚东), (窦唯)-[:堂兄弟]->(窦鹏), (窦唯)-[:兄妹]->(窦颖),(梁朝伟)-[:夫妻]->(刘嘉玲), (王菲)-[:好友]->(刘嘉玲)

变量类型

cypher类型简述

1、属性类型

Number String Boolean Point Date,Time,LocalTime,DateTime,LocalDateTIme,Duration

其数值、字符串、布尔、时间相关的变量可以按java 理解,因neo4j由java开发所以其差距不大。

2、构造类型

Node

节点,节点具有 id 、label(s) 、map (of properties)。也就是 序号、标签、属性图。

RelationShip

关系,关系具有 id、Type、Map(of proerties)、Id of th start node、Id of the end node。也就是序号、关系类型、属性图、开始节点的id、结束节点的id。

Path

路径。由节点和关系所构成的就是路径。

3、集合类型

List, a heterogeneous, ordered collection of values, each of which has any property, structural or composite type.

一个异构(同一个list中不需要都存储同一种类型的成员)、有序的值集合。值可以是属性、结构或者集合类型(也就是list可以套list)。

Map, a heterogeneous, unordered collection of (KeyValue) pairs.

Key is a String

Value has any property, structural or composite type

一个键值对的异构无序集合。key值是字符串,值可以是属性、结构或者集合类型。

关键字语法:

1、match

match 顾名思义,匹配。

match 不可以单独使用,必须搭配return 子句。

match同样经常与where子句组合使用。where子句可以筛选属性、标签内容。

(?:xx) 其中 xx 是标签名,意思是去匹配标签“xx”单节点模式,问号为变量名。

match (?:xx{hh:jj}}) where xx.yy = "zz" return ?.pp ;

注意 .pp 意为只查询某属性,若希望直接返回节点,省去.pp 即可。

{hh:jj}为限定某属性值,效果同where子句。

注意,如果你希望将lable name引起来,那么应当使用 ` 而不是 '

match (n:`动物`{姓名:'老虎大王'}) return n

正在上传…重新上传取消

当我们使用 Ne4j 浏览器时,match语句会自动提示选择现有的 标签label。

模糊查询:

~ 表示模糊查询

.* 相当于SQL中的 %

=~ ".*xx.*" 也就相当于sql中的 like '%xx%'

match可以查询一定距离范围的图。

match(n:国家 {NAME:'中国'})-[*1..3]-(p) return n,p;[ ] 括号内n的意义:n 距离为n..n 最大距离为nn.. 最小距离为nm..n 距离在m到n之间

OPTIONAL MATCH

match在匹配时如果没有找到对象,会返回没有返回值。而OPTIONAL MATCH就算没有匹配到,也会返回表头。

optional MATCH (n:`明星`{`名称`:'奥沙利文'}) return n.`名称`,n.`性别`

正在上传…重新上传取消

可以看到其返回两列表头,而表体为null。

2、create

1)创建节点

CREATE (   <node-name>:<label-name>   {       <Property1-name>:<Property1-Value>      ........      <Propertyn-name>:<Propertyn-Value>   })

创建一个节点。

属性可以不写。

node-name可以不写,除非需要return。

label-name是标签名,同样可以不写,这样创建出来的节点是只有属性而没有标签名的。

正在上传…重新上传取消

如图示。此节点没有标签,只有几个属性。

CREATE (m:Movie:Cinema:Film:Picture)

可以创建多个标签

2)创建关系

CREATE (p1:Profile1)-[r1:LIKES]->(p2:Profile2)

创建的基本格式如上,其中标签都是可选的。

MATCH (a:TEST),(b:TEST)WHERE a.name = 'TEST-NAME' AND b.name = 'TEST-NAME1'CREATE (a)-[r:RELTYPE] -> (b)RETURN r

同理的 create同样可以在 match后面作为子语句使用。上面的代码即为先查询出两个 TEST标签中属性name为 TEST-NAME、 TEST-NAME1 的节点,之后将两个节点之间加上关系。

CREATE p = (a:TEST{name:'TEST-NAME'}) - [:rel3] -> (node) <- [:rel3] - (b:TEST{name:'TEST-NAME1'})RETURN p

也可以直接创建一个

3、delete

很容易理解,意为删除。

可以删除节点,也可以删除节点关系。

MATCH (e: label-name) DELETE e

前面就类似于搜索,只是最后对于e变量的处理变为删除而不是返回。

MATCH (cc: labelname1)-[rel]-(c:labelname2) DELETE labelname1,labelname2,rel

同理,搜索节点及关系后删除。

detach关键字可以关掉高版本neo4j中出现的警告,这个警告一般是在你希望删除一个节点,但是他存在着关系时出现的。

4、romve

格式上类似于delete,它们都应当在match之后使用。不同的地方在于romve删除的是标签和属性,而不是节点和关系本身。

neo4j不允许属性存储空值null。如果属性的值不存在,那么节点或者关系中的属性将被删除。这也可以通过remove来删除。

match (andres) remove andres.age return andresmatch (n) remove n:Chinese return nmatch (n) remove n:Chinese:Man return n

 如下图示意。删除之后节点没有了标签名称。只剩下属性。

正在上传…重新上传取消

5、set

set可以给节点加标签、属性。

match (n:`动物园区内`) set n:动物match (n:`动物园区内`) set n.毛色 = '黄色'

6、要了解查询的工作原理, 可在查询之前加 EXPLAIN 或 PROFILE:

explain match a = (n)-[]-(m) where n.`名称`='周迅' return a

7、merge

merge是一种去重性质的create,语法和create一致,只是它会在同一标签下查询当前语句中的属性是否有已经存在的节点,如果存在,那么就不会再添加一个属性相同的节点。而create就会产生两个节点。

on create 与 on match

on create为,当节点不存在需要被创建的时候,执行 set 语句为其设置值,比如下例,如果需要创建节点,那么就设置时间戳。

MERGE (keanu:Person {name: 'Keanu Reeves'})ON CREATE  SET keanu.created = timestamp()RETURN keanu.name, keanu.created

on match 和 create 正好相反。是当节点存在的时候触发,对所有匹配的节点进行操作。

MERGE (person:Person)ON MATCH  SET person.found = trueRETURN person.name, person.found

当然,两个可以组合起来使用,形成类似于 if else的格式

MERGE (keanu:Person {name: 'Keanu Reeves'})ON CREATE  SET keanu.created = timestamp()ON MATCH  SET keanu.lastSeen = timestamp()RETURN keanu.name, keanu.created, keanu.lastSeen

同样的,也可以用于匹配、创建关系

MATCH (person:Person)MERGE (person)-[r:HAS_CHAUFFEUR]->(chauffeur:Chauffeur {name: person.chauffeurName})RETURN person.name, person.chauffeurName, chauffeur

如果没有就创建。

8、order by

与sql中的排序基本上一致

默认是升序的。如果需要降序,在后面加DESC关键字。

MATCH (emp:Employee)RETURN emp.empid,emp.name,emp.salary,emp.deptnoORDER BY emp.name DESC

9、union 与 union all

这两个子句是将 return 的结果合并输出的。与sql相似。union会去重,union all 并不进行去重。

MATCH (cc:CreditCard)RETURN cc.id as id,cc.number as number,cc.name as name,   cc.valid_from as valid_from,cc.valid_to as valid_toUNION allMATCH (dc:DebitCard)RETURN dc.id as id,dc.number as number,dc.name as name,   dc.valid_from as valid_from,dc.valid_to as valid_to

10、limit  skip

limit限制返回条数。skip跳过若干条结果。都是由 return 处理。

MATCH (n)RETURN nORDER BY n.nameSKIP 1LIMIT 2

意为从第二个开始输出,输出2行数据。

MATCH (n)RETURN nORDER BY n.nameSKIP toInt(3*rand())+ 1

skip也可以输入表达式。

11、NULL

IS NULL 、IS NOT NULL

用于 where 子句中,筛选属性值使用。

MATCH (e:Employee) WHERE e.id IS NULLRETURN e.id,e.name,e.sal,e.deptno

NULL产生的原因

CREATE (e:Employee)

如果我们只是创建了一个没有属性的节点,而如上面的例子中,我们又查看这个标签下所有节点的属性值,就会出现NUL的情况。

12、in

in是where 子句筛选存在某个集合中的结果。

MATCH (e:Employee) WHERE e.id IN [123,124]RETURN e.id,e.name,e.sal,e.deptno

not in

not id(a) in

13、with

with用以在match后操作,where将在with之后执行。

MATCH (人 {名称:'周迅'})-->(otherPerson)WITH otherPerson, toUpper(otherPerson.`名称`) AS upperCaseNameWHERE upperCaseName STARTS WITH '谢'RETURN otherPerson.`名称`

上例中,我们筛选了周迅单向关系指向的所有人,之后将其中姓谢的人筛选出来。

MATCH (节点1:`明星`)-[r]->(节点2:`明星`)WITH *, type(r) AS connectionTypeRETURN 节点1.名称, 节点2.名称, connectionType

也可以使用*以选取所有结果

MATCH (david {名称: '周迅'})--(otherPerson)-->()WITH otherPerson, count(*) AS foafWHERE foaf > 1RETURN otherPerson.名称

返回与周迅连接的节点中与其他节点向外连接数量大于1的节点名称。

MATCH (n)WITH nORDER BY n.名称 DESCLIMIT 3RETURN collect(n.名称)

在输出集合前对结果进行排序

MATCH (n {名称: '周迅'})--(m)WITH mORDER BY m.名称 DESCLIMIT 1MATCH (m)--(o)RETURN o.名称

如上例,可以在路径搜索前限制起点的个数和顺序。上例中限制为一个几点,其与周迅连接,并且以名称为倒序排列。

14、unwind

遍历拆分列表,可以用来将列表转成列或者执行一些其它操作

UNWIND [1, 2, 3, null] AS xRETURN x, 'val' AS y//返回两列

WITH [1, 1, 2, 2] AS collUNWIND coll AS xWITH DISTINCT xRETURN collect(x) AS setOfVals//去重并返回集合

WITH [1, 2] AS a,[3, 4] AS bUNWIND (a + b) AS xRETURN x//遍历多个列表

WITH [[1, 2],[3, 4], 5] AS nestedUNWIND nested AS xUNWIND x AS yRETURN y//列表拆分

match p=(n:明星{名称:"周迅"})-[*1..5]-(m) unwind nodes(p) as x return x//遍历路径

15、foreach

在cypher中,list 列表和 path 路径是十分关键的。关键字foreach可以用来更新数据,比如在路径或者由聚合产生的列表中用来更新属性等。

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

16、call yeld

call可以用于执行子查询,子查询中也可以组合查询,call在你需要使用union时会很有用。

CALL {  MATCH (p:Person)  RETURN p  ORDER BY p.age ASC  LIMIT 1UNION  MATCH (p:Person)  RETURN p  ORDER BY p.age DESC  LIMIT 1}RETURN p.name, p.ageORDER BY p.name

上例查询出年龄最高和年龄最低的两行并且组合

MATCH (p:Person)CALL {  WITH p  OPTIONAL MATCH (p)-[:FRIEND_OF]->(other:Person)  RETURN otherUNION  WITH p  OPTIONAL MATCH (p)-[:CHILD_OF]->(other:Parent)  RETURN other}RETURN DISTINCT p.name, count(other)

同样也可以用于路径相关的union

call的另一个用途是调用存储过程。

CALL db.labels() //显示节点//如果无参数可以省略括号CALL db.labels   //这样写同样正确

call调用存储过程需要知道入参,而YELD关键字是对出参进行操作

CALL dbms.procedures() YIELD name, signatureWHERE name='dbms.listConfig'RETURN signature//下面例子中,其对出参的操作类似with的结构CALL db.labels() YIELD labelWHERE label CONTAINS 'User'RETURN count(label) AS numLabels

如上例,系统自带的存储过程用于查询存储过程的名字和签名。对出参name进行操作过滤,查到另一个存储过程的签名。

CALL dbms.security.createUser('example_username', 'example_password', false)//使用call创建一个新的用户

CALL db.propertyKeys() YIELD propertyKey AS propMATCH (n)WHERE n[prop] IS NOT NULLRETURN prop, count(n) AS numNodes

17、use

基本上和sql中类似,用于确定查询哪个库或者哪个图。

USE myDatabaseMATCH (n) RETURN nUSE exampleFabricSetup.exampleDatabaseNameMATCH (n) RETURN nUSE exampleFabricSetup.graph(0)MATCH (n) RETURN n

18、load csv

1. 编码格式是utf-82. 行终止符是和系统相关的,Unix上是\n,windows上是\r\n3. 默认的字段分隔符是,4. 如果dbms.import.csv.legacy_quote_escaping被设置为真,那么\反斜杠可以被用作转义字符5. 双引号必须在带引号的字符串中使用并带上转义字符\(或第二个双引号进行转义,这里的意思是使用双引号来对双引号进行转义,例如原本文件中的数据是"The ""Symbol""", 返回的数据是"The "Symbol"")。

读取csv文件

如果要直接这样使用,你需要将其放在neo4j文件夹的import文件中。

artist.csv1,ABBA,19922,Roxette,19863,Europe,19794,The Cardigans,1992//如上有一个名为演员的csv文件LOAD CSV FROM 'file:///artists.csv' AS lineCREATE (:Artist {name: line[1], year: toInteger(line[2])})

远程读取

LOAD CSV FROM 'http://data.neo4j.com/bands/artists.csv' AS line CREATE (:Artist {name: line[1],  year: toInteger(line[2])})

如果csv文件自身带有header,那么可以直接选择使用带有的header

Id,Name,Year1,ABBA,19922,Roxette,19863,Europe,19794,The Cardigans,1992LOAD CSV WITH HEADERS FROM 'file:///artists-with-headers.csv' AS lineCREATE (:Artist {name: line.Name, year: toInteger(line.Year)})

一般而言csv文件都是使用逗号进行分割的,但是如果有用其他符号分割的也可以导入,只需要告知分割符号就可以了。

1;ABBA;19922;Roxette;19863;Europe;19794;The Cardigans;1992LOAD CSV FROM 'file:///artists-fieldterminator.csv' AS line FIELDTERMINATOR ';'CREATE (:Artist {name: line[1], year: toInteger(line[2])})

如果导入的文件很大,neo4j提供了一个关键词 periodic  commit ,可以周期性的提交数据以防止在上传过程中突发事件造成上传失败。

默认值情况下,1000上自动向数据库提交一次。

//这里指定了500行提交一次,如果不写就是默认1000行USING PERIODIC COMMIT 500 LOAD CSV FROM 'file:///artists.csv' AS lineCREATE (:Artist {name: line[1], year: toInteger(line[2])})

包含转义字符时。注意双引号只能在被双引号包裹的字符串中使用。并且双引号前需要再加一个双引号用于转义。

"1","The ""Symbol""","1992LOAD CSV FROM 'file:///artists-with-escaped-char.csv' AS lineCREATE (a:Artist {name: line[1], year: toInteger(line[2])})RETURN  a.name AS name,  a.year AS year,size(a.name)   AS size+------------------------------+| name           | year | size |+------------------------------+| "The "Symbol"" | 1992 | 12   |+------------------------------+1 rowNodes created: 1Properties set: 2Labels added: 1

可见结果中在双引号中的两个 " "  都变成了 " 。原因正是因为 "  相当于了一个转义符。

有两个关于csv操作的函数需要知道

LOAD CSV FROM 'file:///artists.csv' AS lineRETURN linenumber() AS number, line+---------------------------------------+| number | line                         |+---------------------------------------+| 1      | ["1","ABBA","1992"]          || 2      | ["2","Roxette","1986"]       || 3      | ["3","Europe","1979"]        || 4      | ["4","The Cardigans","1992"] |+---------------------------------------+4 rowsLOAD CSV FROM 'file:///artists.csv' AS lineRETURN DISTINCT file() AS path+------------------------------------------+| path                                     |+------------------------------------------+| "/home/example/neo4j/import/artists.csv" |+------------------------------------------+1 row

linenumber()是获取行号,从1开始

file是获取csv文件的绝对路径。

19、show functions show procedures show transactions

1)show functions

列出所有可用函数。搭配YELD使用可以筛选出希望获得的某个函数的描述。

//通过系统生成或用户定义来区分SHOW [ALL|BUILT IN|USER DEFINED] FUNCTION[S][YIELD { * | field[, ...] } [ORDER BY field[, ...]] [SKIP n] [LIMIT n]][WHERE expression][RETURN field[, ...] [ORDER BY field[, ...]] [SKIP n] [LIMIT n]]//当前用户可以使用的函数SHOW [ALL|BUILT IN|USER DEFINED] FUNCTION[S] EXECUTABLE [BY CURRENT USER][YIELD { * | field[, ...] } [ORDER BY field[, ...]] [SKIP n] [LIMIT n]][WHERE expression][RETURN field[, ...] [ORDER BY field[, ...]] [SKIP n] [LIMIT n]]//某个特定用户可以使用的函数SHOW [ALL|BUILT IN|USER DEFINED] FUNCTION[S] EXECUTABLE BY username[YIELD { * | field[, ...] } [ORDER BY field[, ...]] [SKIP n] [LIMIT n]][WHERE expression][RETURN field[, ...] [ORDER BY field[, ...]] [SKIP n] [LIMIT n]]

show functions的回参数有 name  category description 对应名称、类型、描述

2)show procedures

列出所有存储过程

回参为 name  description  mode  worksOnSystem。其它与show function基本一致。

3)show transactions

查看正在执行的事务

SHOW TRANSACTION[S] [transaction-id[,...]][YIELD { * | field[, ...] } [ORDER BY field[, ...]] [SKIP n] [LIMIT n]][WHERE expression][RETURN field[, ...] [ORDER BY field[, ...]] [SKIP n] [LIMIT n]]

将时间以毫秒形式输出

SHOW TRANSACTIONS YIELD transactionId, elapsedTime, cpuTime, waitTime, idleTimeRETURN transactionId AS txId,       elapsedTime.milliseconds AS elapsedTimeMillis,       cpuTime.milliseconds AS cpuTimeMillis,       waitTime.milliseconds AS waitTimeMillis,       idleTime.seconds AS idleTimeSeconds

只监视某一个事务

SHOW TRANSACTIONS "neo4j-transaction-3"

终止事务

TERMINATE TRANSACTION[S] transaction_id[, ...]TERMINATE TRANSACTIONS "neo4j-transaction-1","neo4j-transaction-2"

20、Caption   id

id为创建节点时自动生成的自增主键,其最大值约35亿。

caption就是节点上显示的内容。可以进行选择。

正在上传…重新上传取消

函数:

和其它数据库语言相同,cypher同样有一些功能性函数。

仅列出常见函数,希望得知所有函数详见:

官方文档:Functions - Neo4j Cypher Manual

谓词函数

1、Exists

顾名思义,用以判断指定的属性或者关系是否存在。此函数会返回一个布尔类型的结果,true或者false。

MATCH (n)WHERE exists(n.`名称`)RETURN n.`名称` AS name, exists((n)-[:离异]->()) AS 是否离异

在上面的示例中,从明星关系中筛选出有过离异关系的明星。

2、all()  any()  none() single()

依次表示:所有元素都满足条件、至少有一个元素满足条件、所有元素都不满足条件、只有一个元素满足条件。

例如,ALL谓词表示,在路径中,所有节点都必须具有age属性,并且age属性值都必须大于30:

MATCH p =(a)-[*1..3]->(b)WHERE a.name = 'Alice' AND b.name = 'Daniel' AND ALL (x IN nodes(p) WHERE x.age > 30)RETURN p

ANY谓词表示,节点的array属性中至少有一个元素值是one:

MATCH (a)WHERE a.name = 'Eskil' AND ANY (x IN a.array WHERE x = 'one')RETURN a.name, a.array

NONE谓词表示,在路径中,没有节点的age属性等于25

MATCH p =(n)-[*1..3]->(b)WHERE n.name = 'Alice' AND NONE (x IN nodes(p) WHERE x.age = 25)RETURN p

SINGLE谓词表示,在路径中,只有一个节点的eyes属性是blue:

MATCH p =(n)-->(b)WHERE n.name = 'Alice' AND SINGLE (var IN nodes(p) WHERE var.eyes = 'blue')RETURN p

标量函数

返回标量值

1、获得节点、关系的id和属性

id() 返回节点或者关系的id。properties() 返回节点或关系的属性(map)。

CREATE (p:Person { name: 'Stefan', city: 'Berlin' })RETURN id(p), properties(p)

2、获取关系相关的内容

endNode(relationship):返回关系的结束节点

startNode(relationship):返回关系的开始节点

type(relationship):返回关系的类型

MATCH (n)-[r]->()WHERE n.名称 = '周迅'RETURN type(r), startNode(r), endNode(r)

3、获取列表相关的内容

coalesce():返回列表中第一个非NULL的元素

head():返回列表中的第一个元素

last():返回列表中的最有一个元素

size():返回列表中元素的数量

MATCH (a)WHERE a.名称 = '周迅'RETURN a.array, head(a.array), last(a.array), size(a.array)

4、size() length() 获取大小和长度

size(string):表示字符串中字符的数量,可以把字符串当作是字符的列表。

size(list):返回列表中元素的数量。

size(pattern_expression):也是统计列表中元素的数量,但是不是直接传入列表,而是提供模式表达式(pattern_expression),用于在匹配查询(Match query)中提供一组新的结果,这些结果是路径列表,size()函数用于统计路径列表中元素(即路径)的数量。

length(path):返回路径的长度,即路径中关系的数量

MATCH (a)WHERE a.名称 = '周迅'RETURN size((a)-->()-->()) AS fof

聚合函数

聚合函数用于统计查询结果。

avg() count() max() min() sum() collect()

avg()计算平均值

count()计算非null值的数量,可以使用 count(distinct exp) 去重非null,count(*)全部数量,包括null值。

max() min() 计算最大最小值。null值会被排除在外。但是如果null为参数,返回null。

sum()求和,null不计算,sum(null)为0;

collect() 把返回的多个值组装成一个列表。如果参数为null得到空列表。

在聚合操作中,分组键可以对其进行分组。例如return中如果表达式不是聚合函数,那么就将作为分组key。

RETURN type(r), count(*)//是以第一列 type(r)进行分组,之后再聚合形成第二列的数量。

列表函数

主要作用为生成列表、获取列表对象、抽取特定列表冤死、过滤列表元素、进行迭代计算。

1、extract

从列表中抽取值

extract(variable IN list | expression)MATCH p =(a)-->(b)-->(c)WHERE a.name = 'Alice' AND b.name = 'Bob' AND c.name = 'Daniel'RETURN extract(n IN nodes(p)| n.age) AS extracted

如上例中,提取路径中节点的年龄作为一个列表。

2、filter

过滤元素

filter(variable IN list WHERE predicate)MATCH (a)WHERE a.name = 'Eskil'RETURN a.array, filter(x IN a.array WHERE size(x)= 3)

上例中将size为3的元素筛选出来

3、获得图中信息的列表

keys(node):从节点的属性中抽取属性键

labels(node):节点标签的列表

nodes(path):从路径中获取所有节点的列表

relationships(path):从路径中获得所有的关系

MATCH (a)WHERE a.名称 = '周迅'RETURN labels(a),keys(a)MATCH p =(a)-->(b)-->(c)WHERE a.名称 = '周迅' AND c.name = '梁朝伟'RETURN nodes(p), relationships(p)

4、序列生成和倒置

range()生成序列。可以选择间隔大小。

range(start :: INTEGER?, end :: INTEGER?) :: (LIST? OF INTEGER?)range(start :: INTEGER?, end :: INTEGER?, step :: INTEGER?) :: (LIST? OF INTEGER?)

reverse()倒置一个序列。

5、迭代器

reduce() 应用在列表上,对每个元素进行迭代计算。自定义表达式,把当前结果储存在累加器中进行迭代计算,并返回最终计算的标量结果。

reduce(accumulator = initial, e IN list | expression)MATCH p =(a)-->(b)-->(c)WHERE a.name = 'Alice' AND b.name = 'Bob' AND c.name = 'Daniel'RETURN reduce(totalAge = 0, n IN nodes(p)| totalAge + n.age) AS reduction

如上例中,对路径中所有节点的年龄进行累加后输出。

调优

1、希望查看执行计划,使用explain或者profile

explain match a = (n)-[]-(m) where n.`名称`='周迅' return a

·explain并不会运行语句,只进行分析。

PROFILE将运行语句,并且展示检索到了多少行、与存储层进行了多少交互。应当注意的是如果已经确定语句执行很慢,就不要使用它,会产生卡顿。

2、查询的时候加标签。

添加标签可以避免全表查询,在查询节点的时候节省时间。

3、添加索引

在数据库中,索引通过创建一些数据的冗余副本来加快查询速度。但是索引同样会消耗磁盘空间并且在某些情况下会造成更糟糕的结果。因此需要根据实际情况进行是否加索引的判断,添加索引是重要的且有意义的工作。

创建索引之后DBMS会管理它。neo4j在创建索引之后会自动的拾取并上线它,也就是索引在建立之后自动生效。

注意如果先创建索引再导入数据,导入速度会变慢。导入数据之后再创建,索引需要一定时间生效。

可以以 sysinfo 查看信息。如果Index Store不再增长,说明索引已经建立完毕。

CREATE INDEX 创建索引 DROP INDEX 删除索引CREATE INDEX ON :LABEL_NAME(property)DROP INDEX ON :LABEL_NAME(property)比如目前需要创建类型LABEL为phone的节点索引,索引INDEX为手机号phone_no;CREATE INDEX ON :phone(phone_no) //创建phone_no的索引

另外 B tree 索引会在 5.0版本被废除,官方建议使用 full-text 全文索引。

具体创建参照:Full-text search index - Neo4j Cypher Manual

4、维护命令

查询集群节点信息call dbms.cluster.overview()查询所有关系call db.relationshipTypes

示例:

1、查询目前图的结果

我们需要全表查询,比对上面的match语法,匹配全标签,那么省略标签名即可。

match (n) return n

2、清空数据库

match (n) detach delete n//detach意为分离,会开启弱保护机制 不然会提示删除顶点之前要先删除边

3、创建一个节点

create (x:职工{姓名:"老虎大王",from:"森林"}) return x

这个语法中 x 变量名可以省略。如果不需要返回值只需要创建的话,直接写成 :x 即可。

正在上传…重新上传取消

创建了一个职工节点。

其属性意为 老虎大王,从森林来。

4、节点的查询与模糊查询。

match (n) where n.`姓名` = "老虎大王" return nmatch (n) where n.`姓名` =~ "老虎.*" return n

~ 表示模糊查询

.* 相当于SQL中的 %

5、创建双向关系

match (n:`职工`),(s:Employee) where n.`姓名` = "老虎大王" and s.name = "Lokesh"create (n)-[r:打架]->(s),(n)<-[b:劝酒]-(s) return r,b

不可以写成 (a)<-[r]->(b)这种样式。

6、查询直接关系

MATCH m=(:明星 {名称:"周迅"})-[*..1]-() RETURN m

7、查询最短路径

MATCH p = AllShortestPaths( (周迅:明星 {名称:"周迅"})-[*..6]-(王菲:明星 {名称:"王菲"}) ) RETURN p

查询两个节点之间最短的关系路径。

8、创建一个新用户

CALL dbms.security.createUser('example_username', 'example_password', false)

9、查询某个以a开头的函数

SHOW BUILT IN FUNCTIONS YIELD name, isBuiltInWHERE name STARTS WITH 'a'

10、修改两个节点间的关系

没有函数可以直接操作。我们可以使用with关键字,先创建我们希望创建的关系,之后再删除原有关系即可。

MATCH (n:明星 {名称:"周迅"})-[r:绯闻]->(m:明星 {名称:"梁朝伟"})CREATE (n)-[r2:石锤]->(m)//如果需要的话,放开下面的注释,将关系r的属性同样赋值给r2即可。//SET r2 = r WITH rDELETE r

·

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值