请问怎样用LOAD CSV创建节点的同时导入节点的标签呢
发布于 5 年前 作者 prolights 2412 次浏览 来自 问答

tmp.csv Id,Name,Year,Lable 8,ppx,1992,movies 9,大傻瓜,1986,movies:action 希望导入实体的时候,把各自的标签也同时导入。 请问cipher语句该怎么写呢?(不使用apoc,很多线上服务的容器里没有装apoc,暂时不用apoc)。 (https://www.google.com/search?q=LOAD+CSV+lables&oq=LOAD+CSV+lables&aqs=chrome…69i57j33.7705j0j7&sourceid=chrome&ie=UTF-8)没有找到合适的答案。 Thankyou!

8 回复

不考虑apoc的话,LOAD CSV不能多标签,必须指定标签,另外一个角度来看设置多标签会很影响性能,因此官方不支持可能也是这个考虑。可以试试下面的方法(增加一个Type字段):

// 先导入节点
USING PERIODIC COMMIT 1000
LOAD CSV FROM "file://tmp.csv" AS line
MERGE (n:Movie {Id:line.Id}) SET n.Name=line.Name,n.Year=line.Year,n.Type=line.Type
// 然后启动批量更新进程 
CALL apoc.periodic.iterate(‘MATCH (n:Movie) WHERE n.Type=Action RETURN n’,‘WITH {n} AS n SET n:Action’,{batchSize:10000,parallel:false});
CALL apoc.periodic.iterate(‘MATCH (n:Movie) WHERE n.Type=Documentary RETURN n’,‘WITH {n} AS n SET n:Documentary’,{batchSize:10000,parallel:false});
// (另外where后面的属性勿必创建索引)
CREATE INDEX ON :Movie(Type);

@crazyyanchao Thankyou。但因为库比较大,标签的种类非常多,可能不大好一个一个枚举更新。 刚才试了下可以使用./neo4j-import --into /data2/neo4j/erictest1/databases/graph.db --nodes movies.csv --input-encoding UTF-8 --stacktrace true --bad-tolerance 10000 --skip-bad-relationships true --skip-duplicate-nodes true neo4j=import建新库的时候可以把 每个实体的多个标签 直接在创建实体的时候写上去。 👍

@crazyyanchao 请问如果导入的实体的属性很稀疏,对于导入的效率影响大吗? 比如属性的种类有5000,但大部分实体都只有其中的十几二十个属性。 这时的LOAD CSV所使用的csv表就是一个巨大的稀疏矩阵,请问这个情况下对于neo4j-import的执行效率影响大吗?

@prolights 你的节点要是有这么多属性,你就要考虑你的图模型设计是否合理了?属性多肯定会有影响的啊!你需要把这个影响降到最低,生产环境工程可以接受就可以了。

可以创建的时候动态指定节点类型 用apoc的load csv 方法 CALL apoc.create.node([‘Label’], {key:value,…​}) create node with dynamic labels

如果不用apoc,可以自己写一个小脚本执行,自己拼接cypher语句

为啥不用apoc呢

@wkq278276130 neo4j3.2用apoc的时候常常突然crash,所以线上暂时不用

@crazyyanchao 数据库里有很多的不同领域,某一个领域的子图基本上是十几二十个属性吧。但不同的领域的属性取个并集确实有5000了。 然后现在在用的图模型确实非常粗糙😅。

回到顶部