CQL简介

CQL代表Cypher查询语言。 像关系型数据库具有查询语言SQL,Neo4j使用CQL作为查询语言。

Neo4j CQL

它是Neo4j图形数据库的查询语言。
它是一种声明性模式匹配语言。
它遵循SQL语法。
它的语法是非常简单且人性化、可读的格式。
常用的Neo4j CQL命令/条款如下:

image.pngCREATE

CREATE (

: //中括号是可选部分 [{

: ……..

: }] )

语法说明:
image.png
举例:

CREATE (person:Person) CREATE (person:Person {cid:1,name:”范 闲”,age:24,gender:0,character:”A”,money:1000}); CREATE (person:Person {cid:2,name:”林婉 儿”,age:20,gender:1,character:”B”,money:800}); CREATE (person:Person {cid:3,name:”庆 帝”,age:49,gender:0,character:”A”,money:8900});

MATCH RETURN命令语法

MATCH (

: ) RETURN

., …

.

image.png
栗子:

MATCH (person:Person) return person MATCH (person:Person) return person.name,person.age

关系创建

使用现有节点创建没有属性的关系

MATCH (:),(:) CREATE ()-[:]->() RETURN 相应的内容

语法说明
image.png

创建关系 match(person:Person {name:”范闲”}) ,(person2:Person {name:”林婉儿”}) create(person)-[r:Couple]->(person2); 查询关系 match p = (person:Person {name:”范闲”})-[r:Couple]->(person2:Person) return p match (p1:Person {name:”范闲”})-[r:Couple]-(p2:Person) return p1,p2 match (p1:Person {name:”范闲”})-[r:Couple]-(p2:Person) return r

使用现有节点创建有属性的关系

MATCH (:),(:) CREATE ()-[: {}]->() RETURN 其中 是分配给新创建关系的属性(名称 - 值对)的列表。 {

:,

:, …

: }

match(person:Person {name:”范闲”}),(person2:Person {name:”林婉儿”}) create(person)-[r:Couple{mary_date:”12/12/2014”,price:55000}]->(person2) return r;

使用新节点创建没有属性的关系

CREATE (:) -[:]-> (:)

create(person1:Person {cid:4,name:”长公 主”,age:49,gender:1,character:”A”,money:5000}) -[r:Friend]-> (person2:Person {cid:7,name:”九品射手燕小 乙”,age:48,gender:0,character:”B”,money:1000})

使用新节点创建有属性的关系

CREATE (:{}) -[:{}] ->(:{})

create (person1:Person {cid:9,name:”靖王世子”,age:23,gender:0,character:”A”,money:3000}) <-[r:Friend {date:”11-02-2000”}]-> (person2:Person {cid:8,name:”二皇子”,age:24,gender:0,character:”B”,money:6000})

关系和节点的属性可以使用的类型

image.png

CREATE创建多个标签

有多个标签就可以从多个维度去查询这个数据

CREATE (::…..:) 如: CREATE (person:Person:Beauty:Picture {cid:20,name:”小美女”})

WHERE 子句

简单的WHERE子句 WHERE 复杂的WHERE子句

WHERE

where 中的比较运算符 和 之前mysql的相同 如 = != <> > < 等
image.png

MATCH (person:Person)

WHERE person.name = ‘范闲’ OR person.name = ‘靖王世子’

RETURN person

DELETE 子句 和 REMOVE子句

DELETE 子句

  • 删除节点。
  • 删除节点及相关节点和关系。

    match p = (:Person {name:”林婉儿”})-[r:Couple]-(:Person) delete r

REMOVE子句

  • 删除节点或关系的标签
  • 删除节点或关系的属性

    MATCH (person:Person {name:”小美女”})

REMOVE person.cid

SET子句

  • 向现有节点或关系添加新属性
  • 更新属性值

    MATCH (person:Person {cid:1})

SET person.money = 3456,person.age=25

ORDER BY 子句

“ORDER BY”子句,对MATCH查询返回的结果进行排序。我们可以按升序或降序对行进行排序。默认情况下,它按升序对行进行排序。 如果我们要按降序对它们进行排序,我们需要使用DESC子句。

MATCH (person:Person)

RETURN person.name,person.money

ORDER BY person.money DESC

SKIP 和 LIMIT

Neo4j CQL已提供“SKIP”子句来过滤或限制查询返回的行数。 它修整了CQL查询结果集顶部的结果。
Neo4j CQL已提供“LIMIT”子句来过滤或限制查询返回的行数。 它修剪CQL查询结果集底部的结果

MATCH (person:Person)

RETURN ID(person),person.name,person.money

ORDER BY person.money DESC skip 4 limit 2

DISTINCT 排重

这个函数的用法就像SQL中的distinct关键字,返回的是所有不同值。

MATCH (p:Person) RETURN Distinct(p.character)

测试语句

// 删除所有的节点和关系

MATCH(n) OPTIONAL MATCH (n)-[r]-() DELETE n,r

// 创建Person 的节点

CREATE (person:Person {cid:1,name:”范闲”,age:24,gender:0,character:”A”,money:1000,description:”范闲,是猫腻小说《庆余年》主人公,穿越人士,庆国数十年风雨画卷的见证者。其容貌俊美无双,尤胜于女子,生性淡薄刚毅,善良而腹黑,城府极深,重视恩情。最终隐居江南”});

CREATE (person:Person {cid:2,name:”林婉儿”,age:20,gender:1,character:”B”,money:800,description:”林婉儿是庆国宰相和长公主的私生女,电视剧《庆余年》里的女主人公,由李沁饰演”});

CREATE (person:Person {cid:3,name:”庆帝”,age:49,gender:0,character:”A”,money:8900,description:”庆帝,网文作家猫腻所著的权谋小说《庆余年》的角色之一,南庆国的皇帝,心中装有天下统一”});

CREATE (person:Person {cid:4,name:”长公主”,age:46,gender:1,character:”B”,money:3700,description:”《庆余年》中,长公主这个人不仅人设很复杂,就连她的感情生活还是挺复杂。长公主所处的身份就是庆国的公主,皇帝的妹妹,太子的姑姑,国家重要财权的掌管,林婉儿的母亲”});

CREATE (person:Person {cid:5,name:”宰相林若甫”,age:47,gender:0,character:”A”,money:1600,description:”林若甫,是电视剧《庆余年》登场的虚拟人物之一,南庆当朝宰相,林婉儿的亲生父亲。”});

CREATE (person:Person {cid:6,name:”叶灵儿”,age:20,gender:1,character:”C”,money:700,description:”叶灵儿,网文作家猫腻所著的权谋小说《庆余年》的角色之一,林婉儿的好友,最后嫁给了二皇子”});

CREATE (person:Person {cid:7,name:”九品射手燕小乙”,age:47,gender:0,character:”C”,money:900,description:”一品最低,九品最高。庆帝身边的燕小乙便是九品,而且是庆国独一无二的神射手,臂力、眼力、听力惊人”});

CREATE (person:Person {cid:8,name:”二皇子”,age:26,gender:0,character:”B”,money:1700,description:”《庆余年》中,二皇子结局自杀身亡。二皇子对庆帝也是意见很大,但以他的实力还掀不起什么水花,所以只能慢慢等待时机”});

CREATE (person:Person {cid:9,name:”靖王世子”,age:25,gender:0,character:”A”,money:1600,description:”在《庆余年》中,此靖王非彼靖王,但是同音之美也会让人会对靖王世子李弘成这个角色产生好感,而靖王世子李弘成的出场的确是帮助了范闲逃脱太子势力的纠缠”});

CREATE (person:Person {cid:10,name:”王启年”,age:46,gender:0,character:”C”,money:1700,description:”王启年,网文作家猫腻所著的权谋小说《庆余年》的角色之一,庆国监察院一处的文书,擅长追踪之术。”});

CREATE (person:Person {cid:11,name:”北齐圣女海棠朵朵”,age:21,gender:1,character:”A”,money:2600,description:”海棠朵朵是北齐国的才女,被人尊称为圣女,而且是北齐大宗师苦荷的关门弟子,在北齐国也算是举足轻重的人物”});

CREATE (person:Person {cid:12,name:”北齐小皇帝战豆豆”,age:20,gender:0,character:”A”,money:4600,description:”很多人想知道剧中的北齐小皇帝是谁呢?让小编告诉你们吧。 战豆豆是北齐第二任皇帝,乃前北魏一代大将战清风之孙,大宗师苦荷的叔侄女兼徒孙”});

//创建关系

match(person:Person {name:”范闲”}),(person2:Person {name:”林婉儿”}) create(person)-[r:Couple]->(person2);

match(person:Person {name:”范闲”}),(person2:Person {name:”王启年”}) create(person)-[r:Friends]->(person2);

match(person:Person {name:”范闲”}),(person2:Person {name:”北齐圣女海棠朵朵”}) create(person)-[r:Friends]->(person2);

match(person:Person {name:”范闲”}),(person2:Person {name:”庆帝”}) create(person)-[r:Father]->(person2);

match(person:Person {name:”范闲”}),(person2:Person {name:”长公主”}) create(person)-[r:Wife_Mother]->(person2);

match(person:Person {name:”庆帝”}),(person2:Person {name:”二皇子”}) create(person)-[r:Son]->(person2);

match(person:Person {name:”庆帝”}),(person2:Person {name:”长公主”}) create(person)-[r:BrotherSister]->(person2);

match(person:Person {name:”二皇子”}),(person2:Person {name:”靖王世子”}) create(person)-[r:Friends]->(person2);

match(person:Person {name:”北齐圣女海棠朵朵”}),(person2:Person {name:”北齐小皇帝战豆豆”}) create(person)-[r:Friends]->(person2);

match(person:Person {name:”林婉儿”}),(person2:Person {name:”叶灵儿”}) create(person)-[r:Friends]->(person2);

match(person:Person {name:”林婉儿”}),(person2:Person {name:”宰相林若甫”}) create(person)-[r:Father]->(person2);

match(person:Person {name:”林婉儿”}),(person2:Person {name:”长公主”}) create(person)-[r:Mother]->(person2);

match(person:Person {name:”长公主”}),(person2:Person {name:”九品射手燕小乙”}) create(person)-[r:Friends]->(person2);

如果关系建立错了 可以删除关系

match p = (:Person {name:”林婉儿”})-[r:Couple]-(:Person) delete r

考虑了关系的方向

match data=(na:Person {name:”范闲”})-[*2..2]->(nb:Person) return nb

不考虑关系的方向

match data=(na:Person {name:”范闲”})-[*2..2]-(nb:Person) return nb

shortestPath函数返回路径长度最短的path

MATCH p=shortestPath( (person:Person {name:”王启年”})-[*]-(person2:Person {name:”九品射手燕小乙”}) )

RETURN length(p), nodes(p)

不使用 shortestPath

MATCH p=(person:Person {name:”王启年”})-[*]-(person2:Person {name:”九品射手燕小乙”})

RETURN p

MATCH p=shortestPath( (person:Person {name:”王启年”})-[*]-(person2:Person {name:”九品射手燕小乙”}) )

where length(p)>1 RETURN p

explain MATCH p=shortestPath( (person:Person {name:”王启年”})-[*]-(person2:Person {name:”九品射手燕小乙”}) )

where length(p)>1 RETURN p

explain MATCH p=shortestPath( (person:Person {name:”王启年”})-[*]-(person2:Person {name:”九品射手燕小乙”}) )

with p where length(p)>1 RETURN p

全文索引

CALL db.index.fulltext.createNodeIndex(“nameAndDescription”,[“Person”],[“name”, “description”])

CALL db.index.fulltext.queryNodes(“nameAndDescription”, “范闲”) YIELD node, score

RETURN node.title, node.description, score