neo4j是一个将结构化数据存储为图的图数据库,可以快速查询多个事物之间的关系及其关系链。
图是由点(Vertex),边(Edge)和属性(Property)组成的,点和边都可设置属性,点是节点,边是两个节点之间的关系。
使用
用docker测试
docker pull neo4j
docker run -it -d -p 7474:7474 -p 7687:7687 neo4j:latest
添加数据
创建点:
//创建两个节点,会重复创建
create (p1:Person {name:"zhangsan"})
create (p2:Person {name:"lisi"})
创建边
//创建两个节点的同时建立关系
create (p1:Person {name:"zhangsan"}) -[:friend]-> (p2:Person {name:"lisi"})
//创建两个不存在的节点同时建立关系
//merge类似于create if not exist,同时会将这两个节点的变量赋值到p3,p4
//将p3,p4建立连接关系。
merge(p3:Person {name:"wangwu"})
merge(p4:Person {name:"zhaoliu"})
merge(p3) -[:classmate]->(p4)
对存在的节点创建边
//将查到的点赋值到a,b两个变量中并建立连接关系。
match(a:Person {name:"zhangsan"}),(b:Person {name:"lisi"})
merge(a)-[:neighbor]->(b)
查询数据
match可以连接为查询
查询节点
//返回name为zhangsan的Person
match(p:Person {name:"zhangsan"}) return p
根据连接关系查询
//查询zhangsan的neighbor
match (:Person {name:"zhangsan"}) -[:neighbor]-> (p:Person) return p
这里return p相比sql语句,将select换为return,省去from,需要where的情况需要把它写在return前面.
类似于where (condition) return (field) ,(aggregate) (order by field) (limit n)
更新数据
修改节点的属性
//获取节点对象,并用set修改
match (p:Person {name:"zhangsan"}) set p.age= 100
删除连接关系
//获取关系对象,最后用delete删除
match (:Person {name:"zhangsan"}) -[r:neighbor]-> (:Person {name:"lisi"}) delete r
建立索引
需要用where筛选进行查询的用第一种,需要建立唯一约束的用第二种
CREATE INDEX ON :Person(name)
CREATE CONSTRAINT ON (p:Person) ASSERT p.id IS UNIQUE
批量导入
可以用batch import和load csv
其中load csv可以参考以下内容
//将文件放到import/目录下
//连接neo4j
bin/cypher-shell -a bolt://localhost:7687 -u neo4j -p admin
neo4j>CREATE CONSTRAINT ON (p:Person) ASSERT p.name IS UNIQUE
neo4j>USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM 'file:///person_relation.log' AS line FIELDTERMINATOR '\t'
MERGE (a:Person { name: toString(line.nameA)})
MERGE (b:Person { name: toString(line.nameB)})
MERGE (a)-[:neighbor]->(b);
网友评论