如何在neo4j中使用cypher从csv中有条件地导入类别和添加父关系

时间:2014-10-14 09:30:31

标签: neo4j cypher graph-databases

我想从csv创建类别实体,如果csv中的parent_id不为空或0

,还要为该类别创建 PARENT 关系

示例csv如下

cid,category_name,parent_id
1,Category1,0
2,Category1,1
3,Category3,1
4,Category4,3

图形实体就像

 Category{cid,name}

如果csv中的父类别不为空,则添加关系

(cat:Cateogry)-[:PARENT]->(pcat:Category)

下面是我编写的密码及其导入类别但未添加 PARENT 关系

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file://pathto/category.csv" AS csvLine 
 FIELDTERMINATOR ','
MERGE (cat:Category {cid: toInt(csvLine.cid), name:csvLine.category_name})
WITH csvLine, cat
WHERE csvLine.parent_id <> 0
MATCH (pc:Category{cid:csvLine.parent_id}) 
MERGE (cat)-[:PARENT]->(pc)

任何人都可以建议此查询中可能存在的潜在问题,我该如何调试?

1 个答案:

答案 0 :(得分:1)

我认为问题是你在比赛中没有使用toInt

通常,当行的顺序不是父级优先时,您可以在两个地方使用MERGE。

neo4j-community-2.1.5 / bin / neo4j-shell -path test.db -file categories.cql

+-------------------+
| No data returned. |
+-------------------+
Nodes created: 4
Relationships created: 3
Properties set: 8
Labels added: 4
2894 ms
+-------------------------------------------------------------------+
| n                               | pc                              |
+-------------------------------------------------------------------+
| Node[1]{cid:2,name:"Category1"} | Node[0]{cid:1,name:"Category1"} |
| Node[2]{cid:3,name:"Category3"} | Node[0]{cid:1,name:"Category1"} |
| Node[3]{cid:4,name:"Category4"} | Node[2]{cid:3,name:"Category3"} |
+-------------------------------------------------------------------+
3 rows
137 ms

wuqour:类别mh $ cat categories.cql

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///Users/mh/support/categories/categories.csv" AS csvLine 
 FIELDTERMINATOR ','
MERGE (cat:Category {cid: toInt(csvLine.cid)}) 
SET cat.name=csvLine.category_name
WITH csvLine, cat, toInt(csvLine.parent_id) as parent
WHERE parent <> 0
MERGE (pc:Category{cid:parent}) 
MERGE (cat)-[:PARENT]->(pc);

match (n:Category)-[r:PARENT]->(pc)
return n,pc;