赞
踩
目录
(4) merge与on create、on match一起
环境:kali、neo4j2.1.5
格式:
create (Variable:Lable1:Lable2{Key1:Value1,Key2:Value2})
例如:
- create (n:Person { name: 'Tom Hanks', born: 1956 }) return n;
- //该结点标签为Preson(也就是这个结点的名字),结点有两个属性:name和born,属性所对的值分别为:‘Tom Hanks’和‘1956’.
- create (n:Person { name: 'Robert Zemeckis', born: 1951 }) return n;
- create (n:Movie { title: 'Forrest Gump', released: 1951 }) return n;
关于return语句,创建结点后,没有return,截面上将不会出现创建的结点,只会显示有没有创建成功。
match:用于查询数据库;where:用于对查询语句进行约束。
match(n) return n;
match(n) where n.born<1955 return n;
match(n:movie) 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'
- //找到label分别为‘Person’和‘Movie’的两个结点,且a结点的属性name为'Robert Zemeckis'、b结点的属性
- name为'Forrest Gump'。找到后,用a表示Person这个结点,b表示Movie这个结点。
-
- create (a)-[r:DIRECTED]->(b)
- //创建a->b的一个关系,关系用变量r表示,DIRECTED表示关系的类型
-
- 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中,关系分为三种:
- //查询所有跟Movie有关系的结点,并返回
- match(n)--(m:Movie)
- return n;
首先,查看所有的关系:
再查询与movie有关的结点:
- match (n:Person { name: 'Tom Hanks' })-->(movie)
- return n,movie;
- match (n:Person { name: 'Tom Hanks' })-[r]->(movie)
- return r,type(r);
返回关系的类型;
返回关系。
- match (:Person { name: 'Tom Hanks' })-[r:ACTED_IN{roles:['Forrest']}]->(movie)
- return r,type(r);
返回关系类型;
返回关系。
set:用于对更新结点的标签和实体的属性;
remove:用于移除实体的属性和结点的标签。
- 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值为neo结点设置属性和标签。
注意:由于Path是由节点和关系构成的,当路径中的关系或节点不存在时,Neo4j会自动创建。
neo结点的ID值为4。
- match (n)
- where id(n)=4
- set n.name = 'neo'
- return n;
- match (n)
- where id(n)=4
- set n:Company
- return n;
- match (n)<-[r]-(m)
- where id(n)=7 and id(m)=8
- set r.team='Azure'
- return r;
匹配模式:一个节点有Person标签,并且具有name属性;如果数据库不存在该模式,那么创建新的节点;如果存在该模式,那么绑定该节点;
- merge (michael:Person { name: 'Michael Douglas' })
- return michael;
merge 一个标签为:Person,属性name为:Michael Douglas的结点,因为数据库中没有该结点,所以创建一个满足上述条件的结点。即merge语句就相当于create和match语句。
- merge (n:Person)
- return n;
merge一个标签为:Person的结点,因为数据库中有标签为Person的结点,所以merge语句回返回所有标签为Person的结点。
检查节点是否存在,如果不存在则创建它并设置属性。
- merge (keanu:Person { name: 'Keanu Reeves' })
- on create set keanu.created = timestamp()
- return keanu.name, keanu.created
匹配结点,并在找到的结点上设置属性。
- merge (n:Person)
- on match set n.found = TRUE , n.lastAccessed = timestamp()
- return n,n.name, n.found, n.lastAccessed
该语句回匹配所有标签为Person的结点,并为这些结点设置found和lastAccessed两个属性。
- merge (n:Person { name: 'Keanu Reeves' })
- on create set n.created = timestamp()
- on match set n.lastSeen = timestamp()
- return n,n.name, n.created, n.lastSeen
相当于匹配一个标签为Person、name属性为Keanu Reeves的结点,然后为匹配到的结点的设置created、lastSeen这两个属性。
- match (n:Person)
- merge (n)-[:WORKS_AT]->(m:Movie)
- return n,m;
查找标签为Person的结点,merge (n)-[:WORKS_AT]->(m:Movie),如果能找到标签为Person的结点指向标签为Movie的结点,且关系属性为WORKS_AT,就返回符合条件的path;否则创建。
- match (n:Company {name:'neo'})
- return id(n);
- match (n:Person {name:'vic'})-[r]->(m:Company)
- return id(r);
- match (n:Person {name:'vic'})-[r]->(m:Company)
- return type(r);
- match (n:Person {name:'vic'})-[r]->(m:Company)
- return labels(n);
参考资料:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。