neo4j数据库
neo4j简单查询
https://neo4j.com/docs/cypher-refcard/current/ 参考卡片
neo4j存储格式
where子句
match (p:FP{kprq:'王佳慧'}) return p limit 10
match(p:Person{name:"王涛"})-[r]-(n) return p;
MATCH xxx=()-[r:personCompany]->() RETURN xxx LIMIT 25
模糊查询
match (p:FP) where p.hwmc=~'.*BAKEY 无损伤血管钳 90度.*' return p
match (n:N) where n.attr =~ '.*a1.*|.*a2.*' return n
取出所有邻居
# 取出Tom的所有关联的边r和结点n。
match(p:person{name:"Tom"})-[r]-(n) return r,n;
# 取出所有ID=0的结点的personCompany邻居n1(返回包括结点n)
match (n:TaxPayer)-[:personCompany]-(n1) where n.tempID=0 return n,n1
# 取出所有ID=0的结点的 所有类型边 邻居n1(返回包括结点n)
match (n:TaxPayer)-[]-(n1) where n.tempID=0 return n,n1
在现有结点上创建关系
MATCH (cust:Customer),(cc:CreditCard)
CREATE (cust)-[r:DO_SHOPPING_WITH{shopdate:"12/12/2014",price:55000}]->(cc)
RETURN r
二阶邻居
MATCH (js:Person)-[:KNOWS]-()-[:KNOWS]-(surfer)
WHERE js.name = "Johan" AND surfer.hobby = "surfing"
RETURN DISTINCT surfer
delete子句
# 删除所有结点
match ()-[r]-() match (n) delete r,n
复杂语句
with之前语句的查询结果作为之后语句的输入表
MATCH (n:Person) with distinct n.name as a,n.born as b,n.province as c,n.city as d,n.sex as e return count(*)
with语句掌握:
match (n:Person) with n.name as na where na="陈洁" return na
match (n:Person) with n as na where na.name="陈洁" return na
不断嵌套的同义句(和sql中,对表select的结果重命名之后作为下次查询的输入一样):
match (n:Person) return count(n)
match (n:Person) with n as na return count(na)
match (n:Person) with n as na with na as nb return count(nb)
其实这里不加as也是可以的:
match (n:Person) with n return count(n)
match (n:Person) with n where n.name="陈洁" return count(n)
只是为了复杂查询的方便,筛选出符合条件的每一次查询结果:
MATCH (n:Person)-[r:ACTED_IN]->(o:Movie) with o,count(r) as count_r where count_r > 8 RETURN o
这里的count(r)是与o对应的,即符合前面关系的某一个set中的r的数量。
去重查询 distinct
MATCH (n:Person) with distinct n.name as b,n.born as a return count(*)
10150
MATCH (n:Person) with distinct n.name as b return count(*)
9011
--->说明distinct对之后的所有变量都联合去重,而不是只作用于n.name,as也只是别名而会改变distinct的作用域。因重名但不同年而去重的条目数:10150-9011条。
基本语句
插入结点和边的语句
- match (ee:Person{name:"Emil"}) create(:Person{name:"heljg"})若match有匹配,则继续执行、插入结点;否则后面的语句将不执行。
MATCH (ee:Person) WHERE ee.name = "Emil"
CREATE (js:Person { name: "Johan", from: "Sweden", learn: "surfing" }),
(ir:Person { name: "Ian", from: "England", title: "author" }),
(rvb:Person { name: "Rik", from: "Belgium", pet: "Orval" }),
(ally:Person { name: "Allison", from: "California", hobby: "surfing" }),
(ee)-[:KNOWS {since: 2001}]->(js),(ee)-[:KNOWS {rating: 5}]->(ir),
(js)-[:KNOWS]->(ir),(js)-[:KNOWS]->(rvb),
(ir)-[:KNOWS]->(js),(ir)-[:KNOWS]->(ally),
(rvb)-[:KNOWS]->(ally)
若“Emil”结点存在,插入后面的结点和边。
- 一般使用merge更好,可以去重插入。
- in 语句
MATCH (e:Employee)
WHERE e.id IN [123,124]
RETURN e.id,e.name,e.sal,e.deptno

浙公网安备 33010602011771号