neo4j图数据库--Cypher语言入门 二

1、 什么是Cypher

2、写(create、merge、set、delete、remove、foreach、import)

3、读(match、optional match、where、start、聚合)

4、常规(return、order by、limit、skip、with、unwind、union)

5、函数(谓词、标准函数、集合函数、数学函数、字符串函数)

6、模式(索引、约束、统计)

 

1、什么是Cypher

Cypher是一种声明式图查询语言,表达高效查询和更新图数据库。Cypher是相对简单的查询语法,它让我们更关注业务领域问题。

 

2、写

Create:

创建单个节点(注意有个空格):create (n)

创建带标签的节点(ID:n,label:Person):create (n:Person)

创建带两个标签的节点:create (n:Person:Student)

创建带标签、属性的节点: create (n:Person {name:"weiw",age:23})

返回创建的节点:create (a {name:"Tom"}) return a

创建关系(两个节点之间的关系):

match (a:Person),(b:Person) where a.name="zhangs" and b.name="lisi" create (a)-[r:RELTYPE]->(b) return r

创建关系的同时设置属性:

match (a:Person),(b:Person) where a.name="zhangs" and b.name="lisi" 

create (a)-[r:RELTYPE {name:a.name +"<->" + b.name}]->(b) return r

完整创建:三个节点两个关系

create p=(an {name:"an"})-[:WORKS_AT]->(neo)<-[:WORKS_AT]-(mach {name:"mach"}) return p;

 

Merge:

对不存在的节点创建,存在的节点返回。

merge (robert:Critic) return robert,labels(robert);    

单个属性节点:merge (charlie {name:"Charlie",age:10}) return charlie;

带标签和属性的单个节点:merge (michel:Person {name:"michelDoug"}) return michel;

如果要创建节点就设置属性:merge on create

merge (keanu:Person {name:"Keanu"}) on create  set keanu.created=timestamp() return keanu;

如果找到节点就设置属性:merge on match

merge (person:Person) on  match set person.found=true return person;

 

如果找到就设置属性,没找到创建节点并设置属性:merge on create on match:

merge (keanu:Person {name:"Keanu"}) on create set keanu.created=timestamp() on match set keanu.lastSeen=timestamp() return keanu;

 

merge on match 多个属性,如果没有属性则创建:

merge (person:Person) on match set person.found=true,person.lastAccessed=timestamp() return person;

merge 关系:

match (charlie:Person {name:"Charlie"}),(wall:Movie {title:"Wall"})

merge (charlie)-[r:ACTED_AT]->(wall)  return r;

merge多重关系:

MATCH (oliver:Person { name:'Oliver Stone' }),(reiner:Person { name:'Rob Reiner' })

 MERGE (oliver)-[:DIRECTED]->(movie:Movie)<-[:ACTED_IN]-(reiner) RETURN movie

merge非直接关系:

MATCH (charlie:Person { name:'Charlie Sheen' }),(oliver:Person { name:'Oliver Stone' }) 

MERGE (charlie)-[r:KNOWS]-(oliver) RETURN r 

merge 上使用唯一性约束:

CREATE CONSTRAINT ON (n:Person) ASSERT n.name IS UNIQUE; 

CREATE CONSTRAINT ON (n:Person) ASSERT n.role IS UNIQUE;

MERGE (laurence:Person { name: 'Laurence Fishburne' }) RETURN laurence ;

 

Set:

用于更新一个节点和关系的标签或属性。

create (n { name: 'Andres' }) ;

MATCH (n { name: 'Andres' }) SET n.surname = 'Taylor' RETURN n;

删除属性:MATCH (n { name: 'Andres' })  SET n.name = NULL RETURN n

在节点和关系之间复制属性:MATCH (at { name: 'Andres' }),(pn { name: 'Peter' }) SET at = pn RETURN at, pn;

从map添加属性:MATCH (peter { name: 'Peter' }) SET peter += { hungry: TRUE , position: 'Entrepreneur' }

设置多个属性:MATCH (n { name: 'Andres' }) SET n.position = 'Developer', n.surname = 'Taylor'

在节点上加标签:    MATCH (n { name: 'Stefan' }) SET n :German RETURN n

MATCH (n { name: 'Emil' }) SET n :Swedish:Bossman RETURN n 

 

DELETE:

删除节点和关系

删除单个节点:MATCH (n:Useless) DELETE n;

删除节点和连接它的关系:MATCH (n { name: 'Andres' })-[r]-() DELETE n, r

删除所有节点和关系:MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n,r

 

REMOVE:

删除标签和属性

删除属性:MATCH (andres { name: 'Andres' }) REMOVE andres.age RETURN andres;

删除节点的标签:MATCH (n { name: 'Peter' }) REMOVE n:German RETURN n;

删除多重标签:MATCH (n { name: 'Peter' }) REMOVE n:German:Swedish RETURN n

 

FOREACH:

为所有节点设置mark属性:MATCH p = (begin)-[*]->(END ) WHERE begin.name='A' AND END.name='D'  FOREACH (n IN nodes(p)| SET n.marked = TRUE )

 

CREATE UNIQUE:

创建唯一性节点:MATCH (root { name: 'root' }) CREATE UNIQUE (root)-[:LOVES]-(someone) RETURN someone

 

IMPORT CSV:

LOAD CSV WITH HEADERS FROM "http://neo4j.com/docs/2.2.3/csv/import/persons.csv" AS csvLine CREATE (p:Person { id: toInt(csvLine.id), name: csvLine.name }) 

 

id,name 

1,Charlie Sheen 

2,Oliver Stone 

3,Michael Douglas 

4,Martin Sheen 

5,Morgan Freeman 

 

3、读

MATCH:

查询所有节点:MATCH (n) RETURN n

查询指定标签的节点:MATCH (movie:Movie) RETURN movie;

关联节点:MATCH (director { name:'Oliver Stone' })--(movie) RETURN movie.title

查询标签:MATCH (charlie:Person { name:'Charlie Sheen' })--(movie:Movie) RETURN movie

关系查询:MATCH (martin { name:'Martin Sheen' })-->(movie) RETURN movie.title

MATCH (martin { name:'Martin Sheen' })-[r]->(movie) RETURN r 

通过关系类型查询:MATCH (wallstreet { title:'Wall Street' })<-[:ACTED_IN]-(actor) RETURN actor

 

OPTIONAL MATCH:

与match类似,只是如果没有匹配上,则将使用null作为没有匹配上的模式。类似于SQL中的外连接。

匹配关系:match (a:Movie {title:"Wall Street"}) optional match (a)-->(x) return x;  如果没有返回null。

匹配属性:match (a:Movie {title:"Wall Street"}) optional match (a)-->(x) return x,x.name

 

WHERE: 

MATCH (n)  WHERE n.name = 'Peter' XOR (n.age < 30 AND n.name = "Tobias") OR NOT (n.name = "Tobias" OR n.name="Peter") 

RETURN n;

过滤标签:MATCH (n)  WHERE n:Swedish  RETURN n;

过滤属性:MATCH (n)  WHERE n.age < 30  RETURN n;

MATCH (n)  WHERE HAS (n.belt)  RETURN n;

正则:MATCH (n)  WHERE n.name =~ 'Tob.*'  RETURN n;

在where中使用pattern:

MATCH (tobias { name: 'Tobias' }),(others)  WHEREothers.name IN ['Andres', 'Peter'] AND (tobias)<--(others)   RETURN others

使用NOT:MATCH (persons),(peter { name: 'Peter' })  WHERE NOT (persons)-->(peter)  RETURN persons

使用属性:MATCH (n)  WHERE (n)-[:KNOWS]-({ name:'Tobias' })  RETURN n

关系类型:MATCH (n)-[r]->()  WHERE n.name='Andres' AND type(r)=~ 'K.*'  RETURN r

使用IN:MATCH (a)  WHERE a.name IN ["Peter", "Tobias"]  RETURN a

MATCH (n)  WHERE n.belt = 'white'  RETURN n

MATCH (n)  WHERE n.belt = 'white' OR n.belt IS NULL RETURN n  ORDER BY n.name

过滤NULL:MATCH (person)  WHERE person.name = 'Peter' AND person.belt IS NULL RETURN person

 

START:

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

START r=relationship:rels(name = "Andrés")  RETURN r

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

 

聚合函数:

count:MATCH (n { name: 'A' })-->(x)  RETURN n, count(*)

sum:MATCH (n:Person)  RETURN sum(n.property)

avg:MATCH (n:Person)  RETURN avg(n.property)

percentileDisc:计算百分位。MATCH (n:Person)  RETURN percentileDisc(n.property, 0.5)

percentileCont:MATCH (n:Person)  RETURN percentileCont(n.property, 0.4)

stdev:计算标准偏差。MATCH (n)  WHERE n.name IN ['A', 'B', 'C'] RETURN stdev(n.property)

stdevp:MATCH (n) WHERE n.name IN ['A', 'B', 'C']  RETURN stdevp(n.property)

max:MATCH (n:Person) RETURN max(n.property)

min:MATCH (n:Person)  RETURN min(n.property)

collect:MATCH (n:Person) RETURN collect(n.property)

distinct:MATCH (a:Person { name: 'A' })-->(b) RETURN count(DISTINCT b.eyes)

 

 

4、常规

RETURN:

返回一个节点:match (n {name:"B"}) return n;

返回一个关系:match (n {name:"A"})-[r:KNOWS]->(c) return r;

返回一个属性:match (n {name:"A"}) return n.name;

返回所有节点:match p=(a {name:"A"})-[r]->(b) return *;

列别名: match (a {name:"A"}) return a.age as thisisage;

表达式: match (a {name:"A"}) return a.age >30 ,"literal",(a)-->();

唯一结果:match (a {name:"A"})-->(b) return distinct b;

 

ORDER BY:

通过属性排序所有节点:match (n) return n order by n.name;

多个属性排序:match (n) return n order n.name,n.age;

指定排序方式:match (n) return n order by n.name desc;

NULL值的排序:match (n) return n.length,n order by n.length;

 

LIMIT:

match (n) return n order by n.name limit 3;

 

SKIP:

match (n) return n order by n.name skip 3;

match (n) return n order by n.name skip 1 limit 3;

 

WITH:

过滤聚合函数的结果:

MATCH (david { name: "David" })--(otherPerson)-->()  WITH otherPerson, count(*) AS foaf 

WHERE foaf > 1  RETURN otherPerson;

collect前排序结果:MATCH (n)  WITH n   ORDER BY n.name DESC LIMIT 3  RETURN collect(n.name;

limit搜索路径的分支:

MATCH (n { name: "Anders" })--(m)  WITH m 

ORDER BY m.name DESC LIMIT 1  MATCH (m)--(o)  RETURN o.name;

 

UNWIND:

将一个集合展开为一个序列:unwind[1,2,3] as x return x;

创建一个去重的集合:with [1,1,2,3] as coll unwind coll x with distinct x return collect(x) as set;

 

UNION & UNION ALL:

不删除重复:match (n:Actor) return n.name as name union all match(n:Movie) return b.title as name;

删除重复:match (n:Actor) return n.name as name union match(n:Movie) return b.title as name;

 

 

5、函数

谓词:

ALL:ALL(identifier in collection WHERE predicate)

ANY:ANY(identifier in collection WHERE predicate)

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

NONE:NONE(identifier in collection WHERE predicate)

SINGLE:SINGLE(identifier in collection WHERE predicate)

EXISTS:EXISTS( pattern-or-property )

MATCH (n)

WHERE EXISTS(n.name)

RETURN n.name AS name, EXISTS((n)-[:MARRIED]->()) AS is_married

 

Scalar function:

length:返回集合长度。match p=(a)-->(b)-->(c) where a.name="Alice" return length(p)

type:关系类型。match (n)-[r]->() where n.name='Alice' return type(r)

id:返回节点或关系的id。match (a) return id(a)

coalesce:返回第一个not null值。match (a) where a.name='Alice' return coalesce(a.hairColor,a.eyes)

head:返回集合的第一个元素。match (a) where a.name='Alic' return a.array,head(a.array);

last:返回集合的最后一个元素。match (a) where a.name='Alic' return a.array,last(a.array);

timestamp:返回当前时间的毫秒

startNode:返回一个关系的开始节点。match (x:foo)-[r]-() return startNode(r);

endNode:返回一个关系的结束节点。match (x:foo)-[r]-() return endNode(r);

toInt,toFloat,toString

 

集合函数:

nodes(path):返回path中节点。match p=(a)-->(b)-->(c) where a.name='Alice' and c.name='Eskil' return nodes(p)

relationships(path):返回path中的关系。match p=(a)-->(b)-->(c) where a.name='Alice' and c.name='Eskil' return relationships(p)

labels:返回节点标签。match (a) where a.name='Alice' return labels(a);

keys:返回节点的所有属性。match (a) where a.name='Alice' return keys(a);

extract:从一个节点或关系集合中返回单个属性或值的集合。EXTRACT( identifier in collection | 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

filter:FILTER(identifier in collection WHERE predicate)

tail:返回集合中的非第一个元素的集合。

range:RANGE( start, end [, step] ) 。RETURN range(0,10), range(2,18,3)

reduce:REDUCE( accumulator = initial, identifier in collection | expression )。将满足条件的节点的age属性值求和。

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

 

数学函数:

abs(),acos(),asin(),atan(),atan2(x,y),cos(),cot(),degree(),e()返回一个常量,exp(2) e的二次方,floor(0.9)=0.0,

haversin(),log(),log10(),pi()常量PI,radians(180),rand()返回0到1.0的值,round(3.14)=3.0,sign(),sin(),sqrt(),tan()

 

字符串函数:

str(1)="1",replace("hello",'l','w')=hewwo,substring('hello',1,3)="ell",substring("hello",2)="llo",left("hello",3)="hel",

right("hello",3)="llo",ltrim("    hello")="hello",rtrim("hello   ")="hello",trim("   hello   ")="hello",lower("HELLO")="hello",

upper("hello")="HELLO",split("one,two",",")=["one","two"]

 

 

6、模式(索引、约束、统计)

索引:

标签上创建索引:create index on :Person(name)

drop index on :Person(name)

 

约束:

创建唯一约束:CREATE CONSTRAINT ON (book:Book) ASSERT book.isbn IS UNIQUE

删除约束:DROP CONSTRAINT ON (book:Book) ASSERT book.isbn IS UNIQUE

 

### 回答1: 《neo4j权威指南-数据库-大数据时代的新利器.pdf》是一本介绍Neo4j数据库的权威指南。Neo4j是一种高性能、可扩展的数据库,它能够处理大规模复杂数据,并提供了强大的查询和分析功能。 该书结构清晰,内容详细全面。首先介绍了数据库的概念和基本原理,然后详细讲解了Neo4j的安装与配置。接下来,书中介绍了Neo4j数据库的基本操作,包括数据的创建、删除、更新和查询等。 除了基本操作,该书还介绍了Neo4j的高级功能和应用场景。比如,如何构建复杂的结构、如何优化查询性能以及如何进行数据的分析和可视化等。同时,书中也介绍了Neo4j与其他大数据工具(如Hadoop、Spark等)的集成方法。 这本书的优点在于,它不仅仅是一本理论性的指南,更注重实际应用。书中通过大量的示例和案例,让读者能够更好地理解Neo4j的用法和原理,并且能够在实际项目中灵活应用。 总而言之,该书是一本非常实用的数据库指南,对于想要学习和应用Neo4j的人来说是一本不可或缺的参考书。无论是对于数据库的初学者,还是对于有经验的开发者和数据分析师,这本书都能够提供很大的帮助。阅读它能够帮助读者更深入地理解和应用Neo4j数据库,从而在大数据时代中获得新的利器。 ### 回答2: 《neo4j权威指南-数据库-大数据时代的新利器.pdf》是一本介绍Neo4j数据库的权威指南。Neo4j是一种基于模型的高性能、高可伸缩性的数据库管理系统,它的出现使得处理大数据变得更加方便和高效。 这本指南首先介绍了数据库的概念和基本知识,包括的数据结构、节点、关系等。然后详细介绍了如何使用Neo4j进行数据建模,包括节点和关系的创建、属性的定义、查询语言的使用等。 接着,指南介绍了Neo4j的高级功能和特性,如算法、遍历、索引和约束等。这些功能可以帮助用户更加灵活地处理和分析数据,并从中获取有用的信息。 此外,指南还介绍了Neo4j在大数据时代的应用场景,包括社交网络分析、推荐系统、网络安全等。数据库的优势在这些应用中得到了充分展示,为用户提供了更加高效和快速的数据处理方法。 总的来说,《neo4j权威指南-数据库-大数据时代的新利器.pdf》是一本详细介绍Neo4j数据库的权威指南,对初学者提供了宝贵的知识和实践经验,同时也为有经验的用户提供了更多高级功能和应用场景的深入探讨。无论是对于学习者还是开发者来说,这本指南都是一本不可或缺的参考书。 ### 回答3: 《Neo4j权威指南-数据库-大数据时代的新利器》是一本介绍Neo4j数据库的权威指南。数据库是一种以形的形式存储和处理数据的数据库系统,与传统的关系型数据库相比,可以更好地处理复杂的关系和连接。 本书首先介绍了数据库的基本概念和特点,探讨了为什么数据库在大数据时代成为新的利器。随着互联网的快速发展和数据的爆炸式增长,传统的数据库已经无法满足对数据的高效查询和分析的需求,而数据库作为一种新型数据库技术,能够有效解决这些问题。 接着,本书详细介绍了Neo4j数据库的特点、架构和基本操作。Neo4j是目前最流行的数据库之一,它提供了一个高效、灵活和可扩展的数据库解决方案。读者可以通过本书学习如何安装、配置和使用Neo4j,并掌握Cypher查询语言进行数据的查询和分析。此外,本书还介绍了数据库的关键技术,如算法和分析,帮助读者充分发挥数据库在数据挖掘和机器学习等领域的优势。 最后,本书还涵盖了Neo4j在实际应用中的案例和经验。通过实际的案例分析,读者可以了解如何使用Neo4j解决实际的业务问题,并掌握在实际项目中如何优化和调优Neo4j数据库。 总之,《Neo4j权威指南-数据库-大数据时代的新利器》是一本全面而深入的数据库入门指南,对于想要了解和使用数据库的读者来说是一本非常实用的参考书。无论是数据库开发人员、数据科学家还是大数据分析师,都可以从本书中获得宝贵的知识和经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值