neo4j学习
一、载入基本实体信息(参考链接:https://neo4j.com/developer/guide-import-csv/)
(1)LOAD CSV
# 在线导入name.basics.csv
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///name.basics.csv" AS row
CREATE (p:Person { nconst: row.nconst, birthYear: toInteger(row.birthYear), deathYear: toInteger(row.deathYear), primaryProfession: row.primaryProfession, knownForTitles: row.knownForTitles})
# 尝试2 —— merge的时候如果有null会出现问题
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///name.basics.csv" AS row
MERGE (p:Person { nconst: row.nconst, birthYear: row.birthYear, deathYear: row.deathYear, primaryProfession: row.primaryProfession})
WITH p, row
WHERE NOT p.primaryProfession AND p.birthYear AND p.deathYear IS NULL
UNWIND split(row.knownForTitles, ',') AS title
MERGE (t:Title {name: title})
MERGE (p)-[r:ACT]->(t)
# 尝试2解决方案(https://stackoverflow.com/questions/37081842/cant-merge-with-null-values-cannot-merge-node-using-null-property-value-in-n):
# SPLIT列表作为node的解决方案(https://stackoverflow.com/questions/37109997/neo4j-split-string-and-get-position)
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///name.basics.test.csv" AS row
MERGE (p:person { nconst: row.nconst, primaryName: row.primaryName, birthYear: row.birthYear, deathYear: row.deathYear, primaryProfession: row.primaryProfession})
WITH SPLIT(row.knownForTitles, ',') AS title, line
UNWIND RANGE(0, SIZE(SWords)-1) as i
MERGE (p)-[r:ACT {position:i+1}]->(t:name {name: SWords[i]})
# 建立索引
CREATE INDEX ON :Person(PersonID);
# 建立索引并添加一个约束
CREATE CONSTRAINT ON (o:Person) ASSERT o.PersonID IS UNIQUE;
# 在线导入title.ratings.csv
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///title.ratings.csv" AS row
CREATE (T:Title { tconst: row.tconst, averageRating: row.averageRating, numVotes: toInteger(row.numVotes)})
# 建立索引
CREATE INDEX ON :Title(TitleID);
# 建立索引并添加一个约束
CREATE CONSTRAINT ON (o:Title) ASSERT o.TitleID IS UNIQUE;
(2)neo4j-admin import
shell命令行:
../bin/neo4j-admin import --database orders
--nodes=Customer=customers.csv
--nodes=products.csv
--nodes=Order="orders_header.csv,orders1.csv,orders2.csv"
--relationships=CONTAINS=order_details.csv
--relationships=ORDERED="customer_orders_header.csv,orders1.csv,orders2.csv"
--trim-strings=true
二、建立关联
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///products.csv" AS row
MATCH (product:Product {productID: row.ProductID})
MATCH (category:Category {categoryID: row.CategoryID})
MERGE (product)-[:PART_OF]->(category);
参考链接——neo4j创建节点之间的关系:https://blog.csdn.net/fuhanghang/article/details/89373429
# 导入加建立关联
LOAD CSV WITH HEADERS FROM "file:///name.basics.test.csv" AS row
WITH SPLIT(row.knownForTitles, ',') AS title, row
MERGE (p:person { nconst: row.nconst, primaryName: row.primaryName, birthYear: row.birthYear, deathYear: row.deathYear, primaryProfession: row.primaryProfession})
MERGE (t:title {name: title})
CREATE (p)-[r:ACT]->(t)
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///title.ratings.test.csv" AS line
MERGE (T:Title { tconst: line.tconst, averageRating: line.averageRating, numVotes: toInteger(line.numVotes)})
MERGE (T)-[r:SAMEAS]->(t)
三、查询
# 查询基本节点信息
MATCH (n:Title) RETURN n LIMIT 25
# 查询某个标签的所有节点的指定属性
match (p:Person) return p.born limit 10
# 查询符合条件的某个person节点
match (p:Person) where p.born>=1960 return p limit 2
match (p:Person) where p.name='Tom Hanks' return p
match (p:Person { name:'Tom Hanks' } ) return p
四、删除(参考链接:https://www.jianshu.com/p/59bd829de0de
# 删除 Relationship Types
match (n)-[r:PLAYED]-()
detach delete r
# 删除 Node Labels
MATCH (n:Title) DELETE n
# 删除某类节点的所有关系
MATCH (n:Title)-[r]-() DELETE n,r
五、insert导入图谱代码成功案例
LOAD CSV WITH HEADERS FROM "file:///person.csv" AS line
CREATE (n: person{id:line.id,name:line.name})
LOAD CSV WITH HEADERS FROM "file:///movies.csv" AS line
CREATE (n: movie{id:line.id,title:line.title,country:line.country,year:line.year})
LOAD CSV WITH HEADERS FROM "file:///roles.csv" AS line
MATCH (entity1: person{id:line.personId}), (entity2: movie{id:line.movieId})
CREATE (entity1)-[:PLAYED{role:line.role}]->(entity2)