Neo4j使用Cypher查询图形数据,Cypher是描述性的图形查询语言,语法简单,功能强大,由于Neo4j在图形数据库家族中处于绝对领先的地位,拥有众多的用户基数,使得Cypher成为图形查询语言的事实上的标准。
create (A:Person{name:'jim'})-[:Friend]-> (B:Person {name:'tim'})-[:Friend]-> (C:Person {name:'lucy'}), (A)-[:Know]->(C)
(注:()里面的是节点,[]里面的是关系,{}里的是属性, >表示关系的方向)
Create :创建模型语句
match (b)-[:Friend]->(d) where b.name='tim' return d
RETURN: return语句说返回语句,它用于返回查询的结果集。
Cypher语言的关键字不区分大小写,但是属性值,标签,关系类型和变量是区分大小写的。
变量用于对搜索模式的部分进行命名,并在同一个查询中引用,在小括号()中命名变量,变量名是区分大小写的,示例代码创建了两个变量:n和b,通过return子句返回变量b;
MATCH (n)-->(b) RETURN b
在Cypher查询中,变量用于引用搜索模式(Pattern),但是变量不是必需的,如果不需要引用,那么可以忽略变量。
在Cypher查询中,通过逗号来访问属性,格式是:Variable.PropertyKey,通过id函数来访问实体的ID,格式是id(Variable)。
match (n)-->(b) where id(n)=5 and b.age=18 return b;
节点模式的构成:(Variable:Lable1:Lable2{Key1:Value1,Key2,Value2}),实际上,每个节点都有一个整数ID,在创建新的节点时,Neo4j自动为节点设置ID值,在整个数据库中,节点的ID值是递增的和唯一的。
下面的Cypher查询创建一个节点,标签是Person,具有两个属性name和born,通过RETURN子句,返回新建的节点:
create (n:Person { name: 'Tom Hanks', born: 1956 }) return n; create (n:Person { name: 'Robert Zemeckis', born: 1951 }) return n; create (n:Movie { title: 'Forrest Gump', released: 1951 }) return n;
match(n) return n;
match(n) where n.born<1955 return n;
match (n:Movie) return n
match (n {name:'Tom Hanks'}) return n
关系的构成:StartNode - [Variable:RelationshipType{Key1:Value1,Key2:Value2}] -> EndNode,在创建关系时,必须指定关系类型。
MATCH (a:Person),(b:Movie) WHERE a.name = 'Robert Zemeckis' AND b.title = 'Forrest Gump' CREATE (a)-[r:DIRECTED]->(b) RETURN r;
MATCH (a:Person),(b:Movie) WHERE a.name = 'Tom Hanks' AND b.title = 'Forrest Gump' CREATE (a)-[r:ACTED_IN { roles:['Forrest'] }]->(b) RETURN r;
在Cypher中,关系分为三种:符号“–”,表示有关系,忽略关系的类型和方向;符号“–>”和“<–”,表示有方向的关系;
match(n) return n;
示例脚本返回所有与Movie标签有关系的所有结点
match (n)--(m:Movie) return n;
MATCH (:Person { name: 'Tom Hanks' })-->(movie) RETURN movie;
MATCH (:Person { name: 'Tom Hanks' })-[r:ACTED_IN{roles:'Forrest'}]->(movie) RETURN r,type(r);
MATCH (:Person { name: 'Tom Hanks' })-[r:ACTED_IN{roles:'Forrest'}]->(movie) RETURN r,type(r);
set子句,用于对更新节点的标签和实体的属性;remove子句用于移除实体的属性和节点的标签;
由于Path是由节点和关系构成的,当路径中的关系或节点不存在时,Neo4j会自动创建;
CREATE p =(vic:Worker:Person{ name:'vic',title:"Developer" })-[:WORKS_AT]->(neo)<-[:WORKS_AT]-(michael:Worker:Person { name: 'Michael',title:"Manager" }) RETURN p
变量neo代表的节点没有任何属性,但是,其有一个ID值,通过ID值为该节点设置属性和标签
通过节点的ID获取节点,Neo4j推荐通过where子句和ID函数来实现。
match (n) where id(n)=7 set n.name = 'neo' return n;
match (n) where id(n)=7 set n:Company return n;
match (n)<-[r]-(m) where id(n)=7 and id(m)=8 set r.team='Azure' return n;
merge子句的作用有两个:当模式(pattern)存在时,匹配该模式;当模式不存在时,创建新的模式,功能是match子句和create的组合。在merge子句之后,可以显式指定on create 和on match子句,用于修改绑定的结点或者关系的属性。
通过merge子句,可以指定图形中必须存在一个结点,该结点必须具有特定的属性、标签等,如果不存在,那么merge子句就会创建相应的结点。
匹配模式是:一个节点有Person标签,并且具有name属性;如果数据库不存在该模式,那么创建新的节点;如果存在该模式,那么绑定该节点;
MERGE (michael:Person { name: 'Michael Douglas' }) RETURN michael;
2,在merge子句中指定on create子句
如果需要创建节点,那么执行on create子句,修改节点的属性;
MERGE (keanu:Person { name: 'Keanu Reeves' }) on create set keanu.created=timestamp() RETURN keanu;
3,在merge子句中指定on match子句
如果节点已经存在于数据库中,那么执行on match子句,修改节点的属性;
MERGE (person:Person) ON MATCH SET person.found = TRUE RETURN person.name, person.found
4,在merge子句中同时指定on create 和 on match子句
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 (charlie:Person { name: 'Charlie Sheen' }),(wallStreet:Movie { title: 'Wall Street' }) MERGE (charlie)-[r:ACTED_IN]->(wallStreet) RETURN charlie.name, type(r), wallStreet.title
6,merge子句用于match或create多个关系
MATCH (oliver:Person { name: 'Oliver Stone' }),(reiner:Person { name: 'Rob Reiner' }) MERGE (oliver)-[:DIRECTED]->(movie:Movie)<-[:ACTED_IN]-(reiner) RETURN movie
7,merge子句用于子查询
MATCH (person:Person) MERGE (city:City { name: person.bornIn }) RETURN person.name, person.bornIn, city; MATCH (person:Person) MERGE (person)-[r:HAS_CHAUFFEUR]->(chauffeur:Chauffeur { name: person.chauffeurName }) RETURN person.name, person.chauffeurName, chauffeur; MATCH (person:Person) MERGE (city:City { name: person.bornIn }) MERGE (person)-[r:BORN_IN]->(city) RETURN person.name, person.bornIn, city;
MATCH (:Person { name: 'Tom Hanks' })-[r]->(movie) RETURN id(r);
2,通过type函数,查询关系的类型
MATCH (:Person { name: 'Tom Hanks' })-[r]->(movie) RETURN type(r);
3,通过lables函数,查询节点的标签
MATCH (:Person { name: 'Tom Hanks' })-[r]->(movie) RETURN labels(movie);
4,通过keys函数,查看节点或关系的属性键
MATCH (a) WHERE a.name = 'Alice' RETURN keys(a)
5,通过properties()函数,查看节点或关系的属性
CREATE (p:Person { name: 'Stefan', city: 'Berlin' }) RETURN properties(p)