图库Neo4j使用cypher语句为基本操作语言,本文总结一些关键字的使用方法
Load csv
读取文件load csv with headers from ‘file:///ces.csv‘ as line with line, linenumber()-1 as number
call apoc.create.node([line.table],{table:line.table, ziduan:line.ziduan}) yield node return number
LOAD CSV FROM ‘file:///F:\\code\\java\\helloworld\\artists.csv‘ AS line
CALL apoc.export.cypher.all(‘export.cypher‘,{format:‘cypher-shell‘})
cat export.cypher | cypher-shell -u neo4j -p neo4j
并重启neo4j服务create (n:Person)-[:LOVES]->(m:Dog)
create (z:ziduan{name:"f_name",table:"dianlibiao"}) return count(*)
create (n:Person{name:"李四"})-[:FEAR{level:1}]->(t:Tiger{type:"东北虎"})
match (n:Person{name:""王五""}), (m:Person{name:"赵六"}) create (n)-[k:KNOW]->(m) return k
match (n:Person{name:"李四"})-[f:FEAR]->(t:Tiger) delete f
match(m)-[b:bian]-(n) delete b
match (n:Person{name:"李四"}) delete n
match(n) detach delete n
match (n) delete n
match (n) detach delete n
MATCH (r:Loc) DETACH DELETE r
match
(node)-[relationship]->(node)
where
(node | relationship)
return
(node | relationship)
match (n:Persion)-[:HAS_PHONE]->(p:Phone) where n.name="姓名6" return n, p limit 10
n: 表示别名,这里定义了不同实体的别名n 和 p
:HAS_PHONE 表示关系名称
() 圆括号里面表示实体 [] 方括号里面表示关系,都是英文状态下
()-[]->() 表示实体-关系-实体 该关系是有方向的,若要表示无方向的关系,则用: ()-[]-()
match(n) return n
match (t:Tiger) where id(t)=1837 return t
match (t:Tiger) where id(t)=1837 delete t
match (n:Persion)-[:HAS_PHONE]->(p:Phone)-[:CALL]->(p1: Persion) where n.name=“姓名6” return n, p,p1 limit 10
match p=()-[c: CALL]->() return p limit 10
match (n:USERS) where n.name=~‘Jack.*‘ return n limit 10
match (n:USERS) where n.name= contains ‘J‘ return n limit 10
match (n:Person{name:"王五"}), (m:Person{name:"赵六"}) return n,m
match(n) where n:标签1 or n:标签B return distinct n;
match(n) where not n:标签1 and not n:标签B return distinct n;
match (t:Tiger) where id(t)=1837 set t:A return t
本质上是给实体增加一个标签,一个实体可以有多个标签
此时该实体有两个标签A Tiger
2. 给实体增加属性
match (a:A) where id(t)=1837 set a.年龄=10 return a
match (n:Person)-[l:LOVE]->(:Person) set l.date="1990" return n, l | |
match(n) set n:table return n
create index on :Person(name)
drop index on :Person(name)
create constraint on (p:Person) assert (p.name) is unique
drop constraint on (p:Person) assert (p.name) is unique
match (p1:Person{name:"姓名2"}),(p2:Person{name:"姓名10"}), p=shortestpath((p1)-[*..10]-(p2)) return p
shortestpath()用于查询最短路径 [*..10] 表示关系中不超过10度关系
match (p1:Person{name:"姓名2"}),(p2:Person{name:"姓名10"}), p=allshortestpaths((p1)-[*..10]-(p2)) return p
match (n:ERP_anek) with collect(n) as list call apoc.refactor.mergeNodes(list, {properties:{ziduan:‘combine‘}}) yield node return count(node)
表ERP_anek是实体,属性为该表字段,数据导入后,将多个实体合并
WITH [[1, 2],[3, 4], 5] AS nested
UNWIND nested AS x
UNWIND x AS y
RETURN y
依次遍历拆开多个列表
CALL db.labels() YIELD label
WHERE label CONTAINS ‘User‘
RETURN count(label) AS numLabels
1、yield和call 关键字 通常一起使用
2、call 后跟图库已实现的procedure,如各种apoc功能, 而yield则为得到
3、call后需加上 procedure的入参;而yield后可加 procedure的返回值
match (n:Person{name:"王五"}), (m:Person{name:"赵六"}) merge (n)-[l:LOVE]->(m) return l
match (n),(m) where n=m merge (n)-[t:TABLE{table_name:n.table}]-(m) return t
OPTIONAL MATCH (n)-[r]->(m) RETURN m
匹配结果集中如果有丢的部分,则会用null来补充
MATCH (n)
WHERE n.name STARTS WITH ‘张‘
RETURN n
MATCH (n)
WHERE n.name ENDS WITH ‘三‘
RETURN n
模板 :
split(original, splitDelimiter)
使用splitDelimiter切分original
LOAD CSV WITH HEADERS FROM ‘file:///employees.csv‘ AS row
MERGE (e:Employee {employeeId: row.Id, email: row.Email})
WITH e, row
UNWIND split(row.Skills, ‘:‘) AS skill
MERGE (e:Employee {employeeId: row.employeeId, name: row.Name})
RETURN count(e);
统计指定标签下节点个数
WITH [1,1,2,2] AS coll UNWIND coll AS x
WITH DISTINCT x
RETURN collect(x) AS SET
LOAD CSV FROM ‘{csv-dir}/artists.csv‘ AS line RETURN linenumber() AS number, line XXXX
按行导入csv,并返回linenumber
通常用于批量执行语句中,可将多条语句累计一定量后提交, 如load csv 按行载入数据,可以每1000行提交一版
USING PERIODIC COMMIT 1000
LOAD CSV FROM ‘{csv-dir}/artists.csv‘ AS line
1、指示Neo4j在多行之后执行提交
2、减少了事务状态的内存开销
3、提交将每1000行发生一次
grant 操作需要企业版,社区版由于无法赋权,所以很多高性能操作无法实现
Grant 赋权 共包含8大类:
1)为图的不同部分定义了写特权:
CREATE -允许创建节点和关系。
DELETE -允许删除节点和关系。
SET LABEL-允许使用SET子句设置指定的节点标签。
REMOVE LABEL-允许使用REMOVE子句删除指定的节点标签。
SET PROPERTY -允许在节点和关系上设置属性。
2)还有一些组合特权,这些特权组合了上述特定特权:
MERGE-允许match,create和set属性以允许MERGE命令。
WRITE -允许在整个图形上进行所有写操作。
ALL GRAPH PRIVILEGES -允许在整个图形上进行所有读取和写入操作。
grant create on graph neo4j elements * to neo4j *给neo4j用户增加对neo4j图库的create权限*
Neo4j Cypher Refcard 4.1 语法使用查找表
CALL apoc.periodic.iterate( statement1, statement2, { batchSize:1000, iterateList:true, parallel:false, params:{}, concurrency:50, retries:0 } )
YIELD batches, total
1、建议始终设置iterateList:true,因为这样使得一个批次中所有内查询(由batchSize决定)会作为一个事务被提交、从而提高运行效率。
2、仅当数据库是存储在SSD(固态硬盘)时才使用parallel:true选项,因为SSD具有更好的随机读写速率。如果是物理硬盘则不要使用并行选项,因为这反而会降低整体执行效率。
3、并发数concurrency通常设置成分配给数据库服务运行的CPU内核数的整数倍。例如,如果Neo4j服务器运行在8个CPU内核的虚拟或物理主机上,那么concurrency可以是8、16、24等值。
4、并发执行时,如果不同线程需要对同一数据库对象(节点或关系)进行更新,先执行的线程会对待更新的数据库对象加锁(locking),这时其它线程的更新会被阻塞、并报告“锁获取失败”或者Java NullPointerException空指针错误。
一种解决方法是设置重试次数retries,每次重试会等待100ms。
如果还是出现死锁,则不使用并行执行。
call apoc.cypher.parallel(‘match (n:ERP_anek),(m) where not m:ERP_anek and n.ziduan = m.ziduan merge (n)-[b:bian{lianlu:n.ziduan}]-(m) return b.lianlu‘, {table: [‘ERP_anek‘,‘ERP_crhd‘,‘ERP_iseg‘]},‘table‘) yield value
需要grant 添加权限,而grant 操作需要企业版
未完待续...
原文:https://www.cnblogs.com/andre-ma/p/13903418.html