Neo4j:Cypher入门

Neo4j使用Cypher查询图形数据,Cypher是描述性的图形查询语言,语法简单,功能强大,由于Neo4j在图形数据库家族中处于绝对领先的地位,拥有众多的用户基数,使得Cypher成为图形查询语言的事实上的标准。

创建节点

节点模式的构成:(Variable:Lable1:Lable2{Key1:Value1,Key2,Value2}),实际上,每个节点都有一个整数ID,在创建新的节点时,Neo4j自动为节点设置ID值,在整个数据库中,节点的ID值是递增的和唯一的。

create (n:Person { name: '周星驰', born: 1956 }) return n;
create (n:Person { name: '元华', born: 1951 }) return n;
create (n:Person { name: '梁小龙', born: 1953 }) return n;
create (n:Movie { title: '功夫', released: 2004}) return n;

上面的Cypher查询创建一个节点,标签是Person,具有两个属性name和born,通过RETURN子句,返回新建的节点

查询节点

通过match子句查询数据库,match子句用于指定搜索的模式(Pattern),where子句为match模式增加谓词(Predicate),用于对Pattern进行约束;

  1. 查询整个图形数据库
match(n) return n;

变量用于对搜索模式的部分进行命名,并在同一个查询中引用,在小括号()中命名变量,变量名是区分大小写的

  1. 根据属性查询
    在Cypher查询中,通过逗号来访问属性,格式是:Variable.PropertyKey,通过id函数来访问实体的ID,格式是id(Variable)。
    查询born属性小于1955的节点
match(n) 
where n.born<1955 
return n;

查询具有指定属性的节点

match(n{name:'Tom Hanks'}) 
return n;
  1. 根据Lable查询
    查询具有指定Lable的节点
match(n:Movie) 
return n;

创建关系

关系的构成:StartNode – [Variable:RelationshipType{Key1:Value1,Key2:Value2}] -> EndNode,在创建关系时,必须指定关系类型1,创建没有任何属性的关系

MATCH (a:Person),(b:Movie)
WHERE a.name = '周星驰' AND b.title = '功夫'
CREATE (a)-[r:DIRECTED]->(b)
RETURN r;

结果

《Neo4j:Cypher入门》

  1. 创建关系,并设置关系的属性
MATCH (a:Person),(b:Movie)
WHERE a.name = '梁小龙' AND b.title = '功夫'
CREATE (a)-[r:ACTED_IN { roles:['火云邪神'] }]->(b)
RETURN r;
MATCH (a:Person),(b:Movie)
WHERE a.name = '元华' AND b.title = '功夫'
CREATE (a)-[r:ACTED_IN { roles:['包租公'] }]->(b)
RETURN r;
MATCH (a:Person),(b:Movie)
WHERE a.name = '周星驰' AND b.title = '功夫'
CREATE (a)-[r:ACTED_IN { roles:['星仔'] }]->(b)
RETURN r;

查询关系

在Cypher中,关系分为三种:符号“–”,表示有关系,忽略关系的类型和方向;符号“–>”和“<–”,表示有方向的关系;

  1. 查询跟指定节点有关系的节点
match(n)--(m:Movie) 
return n;
  1. 查询有向关系的节点
MATCH (:Person { name: '周星驰' })-->(movie)
RETURN movie;
  1. 为关系命名,通过[r]为关系定义一个变量名,通过函数type获取关系的类型
MATCH (:Person { name: '元华' })-[r]->(movie)
RETURN r,type(r);
  1. 查询特定的关系类型,通过[Variable:RelationshipType{Key:Value}]指定关系的类型和属性
MATCH (:Person { name: '元华' })-[r:ACTED_IN{roles:'包租公'}]->(movie)
RETURN r,type(r);

更新图形

set子句,用于对更新节点的标签和实体的属性;remove子句用于移除实体的属性和节点的标签;

  1. 创建一个完整的Path
    由于Path是由节点和关系构成的,当路径中的关系或节点不存在时,Neo4j会自动创建;
CREATE p =(:Person{ name:'朱茵', born: 1971 })-[:ACTED_IN]->(neo)<-[:ACTED_IN]-(:Person { name: '吴孟达', born: 1956 })
RETURN p

《Neo4j:Cypher入门》

  1. 为节点增加属性
    通过节点的ID获取节点,Neo4j推荐通过where子句和ID函数来实现。
match (n)
where id(n)=8
set n.title = '月光宝盒',n.released=1994
return n;
  1. 为节点增加标签
match (n)
where id(n)=8
set n:Movie
return n;

4,为关系增加属性

match (n)<-[r]-(m)
where id(n)=8 and id(m)=7
set r.roles='紫霞仙子'
return n;
  1. 为节点删除属性
    通过节点的ID获取节点,Neo4j推荐通过where子句和ID函数来实现。
match (n)
where id(n)=7
remove n.title
return n;

删除

  1. 删除节点
match (n)
where id(n)=2
delete n;
  1. 删除关系
MATCH (:Person { name: '巩俐' })-[r]->(movie)
delete r;
MATCH (p:Person { name: '周星驰' })-[r:DIRECTED]->(m:Movie)
where ID(m)=14
delete r;
  1. 同时删除关系和节点
MATCH (p:Person)-[r]->(m:Movie)
where ID(m)=12
delete r,m;

跟实体相关的函数

  1. 通过id函数,返回节点或关系的ID,通过type函数,查询关系的类型
MATCH (:Person)-[r]->(movie)
return id(r),type(r);
  1. 通过keys函数,查看节点或关系的属性键
MATCH (a)
WHERE a.name = '元华'
RETURN keys(a)
  1. 通过properties()函数,查看节点或关系的属性
MATCH (a)
WHERE a.name = '元华'
RETURN properties(a)
  1. 通过labels函数,查询节点的标签
MATCH (a)
WHERE a.name = '元华'
RETURN labels(a)

Merge子句

Merge子句的作用有两个:当模式(Pattern)存在时,匹配该模式;当模式不存在时,创建新的模式,功能是match子句和create的组合。在merge子句之后,可以显式指定on creae和on match子句,用于修改绑定的节点或关系的属性。
通过merge子句,你可以指定图形中必须存在一个节点,该节点必须具有特定的标签,属性等,如果不存在,那么merge子句将创建相应的节点。

  1. 通过merge子句匹配搜索模式
    匹配模式是:一个节点有Person标签,并且具有name属性;如果数据库不存在该模式,那么创建新的节点;如果存在该模式,那么绑定该节点;
MERGE (n:Person { name: '巩俐' })
RETURN n;
  1. 在merge子句中指定on create子句
    如果需要创建节点,那么执行on create子句,修改节点的属性;
MERGE (n:Person { name: '陈百祥' })
ON CREATE SET n.born= 1964
RETURN n;
MERGE (n:Movie { title: '唐伯虎点秋香' })
ON CREATE SET n.released= 1993
RETURN n;
  1. 在merge子句中指定on match子句

如果节点已经存在于数据库中,那么执行on match子句,修改节点的属性;

MERGE (n:Person { name: '巩俐' })
ON MATCH SET n.born= 1974
RETURN n;
  1. merge子句用于match或create一个关系
MATCH (p:Person { name: '巩俐' }),(m:Movie { title: '唐伯虎点秋香' })
MERGE (p)-[r:ACTED_IN]->(m)
RETURN p.name, type(r), m.title
  1. merge子句用于match或create多个关系
MATCH (p1:Person { name: '陈百祥' }),(p2:Person { name: '周星驰' })
MERGE (p1)-[:ACTED_IN]->(m:Movie)<-[:DIRECTED]-(p2)
ON CREATE SET m.title= '鹿鼎记'
RETURN m

最终得到的结果

《Neo4j:Cypher入门》

参考
https://www.cnblogs.com/ljhdo/p/5516793.html

    原文作者:季舟1
    原文地址: https://www.jianshu.com/p/8222a9330b88
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞