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条。

基本语句

插入结点和边的语句

  1. 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”结点存在,插入后面的结点和边。

  1. 一般使用merge更好,可以去重插入。
  2. in 语句
MATCH (e:Employee) 
WHERE e.id IN [123,124]
RETURN e.id,e.name,e.sal,e.deptno
posted @ 2021-03-16 17:27  zae  阅读(192)  评论(0)    收藏  举报