图数据库Neo4j学习一

7 篇文章 0 订阅
2 篇文章 0 订阅

一个图数据库有这么几个标签属性

图形数据库数据模型的主要构建块是:

1. 节点

2. 关系

3. 属性

 

手册:Link

CREATE命令语法:

CREATE (
   <node-name>:<label-name>
   { 	
      <Property1-name>:<Property1-Value>
      ........
      <Propertyn-name>:<Propertyn-Value>
   }
)
CREATE (<node1-name>:<label1-name>)-
	[(<relationship-name>:<relationship-label-name>)]
	->(<node2-name>:<label2-name>)

 

语法说明:

语法元素描述
<node-name>它是我们将要创建的节点名称。
<label-name>它是一个节点标签名称
<Property1-name>...<Propertyn-name>属性是键值对。 定义将分配给创建节点的属性的名称
<Property1-value>...<Propertyn-value>属性是键值对。 定义将分配给创建节点的属性的值

 

MATCH命令语法

MATCH 
(
   <node-name>:<label-name>
)

语法说明

语法元素描述
<node-name>这是我们要创建一个节点名称。
<label-name>这是一个节点的标签名称

 

RETURN命令语法

RETURN 
   <node-name>.<property1-name>,
   ...
   <node-name>.<propertyn-name>

语法说明:

语法元素描述
<node-name>它是我们将要创建的节点名称。
<Property1-name>...<Propertyn-name>属性是键值对。 <Property-name>定义要分配给创建节点的属性的名称

 example:

MATCH (n:Person)-[:KNOWS]->(m:Person)
WHERE n.name = 'Alice' return n.name

 

参考:Link

1,创建
create (:Movie {title:"驴得水",released:2016})
 return p;


当然cypher也可以一次创建多个数据,并同时添加关系

2,查询
match (p: Person) return p; 查询Person类型的所有数据

match (p: Person {name:"sun"}) return p; 查询名字等于sun的人

match( p1: Person {name:"sun"} )-[rel:friend]->(p2) return p2.name , p2.age 查询sun的朋友的名字和年龄

match (old) … create (new) create (old)-[rel:dr]->(new) return new 对已经存在的节点和新建的节点建立关系

3,查询或更新
merge 语法可以对已经存在的节点不做改变,对变化的部分会合并

MERGE (m:Movie { title:"Cloud Atlas" })ON CREATE SET m.released
= 2012RETURN m

merge …. on create set … return 语法支持合并更新

4,筛选过滤
cypher过滤也是用的和SQL一样的关键词where

match (p1: Person) where p1.name="sun" return p1;

等同下面的

match (p1: Person {name:"sun"}) return p1

注意where条件里面支持 and , or ,xor,not等boolean运算符,在json串里面都是and

除此之外,where里面查询还支持正则查询

match (p1: Person)-[r:friend]->(p2: Person) where p1.name=~"K.+" or
p2.age=24 or
"neo" in r.rels return p1,r,p2

关系过滤匹配使用not

MATCH (p:Person)-[:ACTED_IN]->(m)WHERE NOT (p)-[:DIRECTED]->()RETURN p,m

5,结果集返回
MATCH (p:Person)RETURN p, p.name
AS name, 
upper(p.name), coalesce(p.nickname,"n/a")
AS nickname, { name: p.name,

  label:head(labels(p))}
AS person

结果集返回做去重

match (n) return distinct n.name;

6,聚合函数
cypher支持count,sum,avg,min,max

match (: Person) return count(*)

聚合的时候null会被跳过 count 语法 支持 count( distinct role )

MATCH (actor:Person)-[:ACTED_IN]–>(movie:Movie)<–[:DIRECTED]–(director:Person)RETURN actor,director,count(*)
AS collaborations

7,排序和分页
MATCH (a:Person)-[:ACTED_IN]->(m:Movie)RETURN a,count(*)
AS appearancesORDER BY appearances
DESC SKIP 3 LIMIT 10;

8, 收集聚合结果
MATCH (m:Movie)<-[:ACTED_IN]-(a:Person)

RETURN m.title AS movie, collect(a.name) AS cast,
count(*) AS actors

9, union 联合
支持两个查询结构集一样的结果合并

MATCH (actor:Person)-[r:ACTED_IN]->(movie:Movie)

RETURN actor.name AS name, type(r) AS acted_in, movie.title AS title

UNION (ALL)

MATCH (director:Person)-[r:DIRECTED]->(movie:Movie)

RETURN director.name AS name, type(r) AS acted_in, movie.title AS title

10, with
with语句给cypher提供了强大的pipeline能力,可以一个或者query的输出,或者下一个query的输入 和return语句非常类似,唯一不同的是,with的每一个结果,必须使用别名标识。

通过这个功能,我们可以轻而易举的做到在查询结果里面在继续嵌套查询。

MATCH (person:Person)-[:ACTED_IN]->(m:Movie)

WITH person, count(*) AS appearances,
collect(m.title) AS movies

WHERE appearances > 
1

RETURN person.name, appearances, movies

注意在SQL里面,我们想过滤聚合结果,需要使用having语句但是在cypher里面我们可以配合with语句使用 where关键词来完成过滤

11,添加约束或者索引
唯一约束(使用merge来实现) CREATE CONSTRAINT ON (movie:Movie) ASSERT movie.title IS UNIQUE

添加索引(在图谱遍历时,快速找到开始节点),大幅提高查询遍历性能 CREATE INDEX ON :Actor(name)

添加测试数据:

CREATE (actor:Actor {
name:"Tom Hanks" }),(movie:Movie {
title:‘Sleepless IN Seattle’ }),

  (actor)–[:ACTED_IN]–>(movie);

使用索引查询:

MATCH (actor:Actor {
name: "Tom Hanks" })RETURN actor;

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值