Neo4j Cypher - 根据CSV值导入并在节点之间添加关系

4

在Cypher中,是否可以使用导入功能根据CSV的值创建节点之间的不同关系。

例如: 对于给定的CSV数据

product_id  user_id  action
1           1        VIEW
1           2        PURCHASE

我需要创建产品节点(product_id),用户节点(user_id)和基于csv中“action”字段的值在“用户”和“产品”节点之间创建VIEW或PURCHASE关系。
以下是我尝试过的方法。我知道语法不正确,但只是为了让你了解我正在尝试做什么。
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file://pathto/product-event.csv" AS csvLine 
FIELDTERMINATOR ','
MERGE ( prod:Product{pid: toInt(csvLine.product_id)} )
MERGE ( usr:User { cid: toInt(csvLine.userid)  })
WITH prod,usr , CASE  
    WHEN csvLine.action ='VIEW' THEN  'VIEW'
    WHEN csvLine.action ='PURCHASE' THEN  'PURCHASE'
    ELSE 'VIEW' END AS action
MERGE (usr)-[:action]->(prod)



USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///pathto/product-event.csv" AS csvLine 
FIELDTERMINATOR ','
MERGE ( prod:Product {pid: toInt(csvLine.productid) } )
MERGE ( usr:User { cid: toInt(csvLine.userid) }
    )
ON CREATE SET 
    prod.created=timestamp()
WHERE csvLine.action = 'VIEW'
MERGE (cust)-[:VIEW]->(prod)
WHERE csvLine.action = 'PURCHASE'
MERGE (usr)-[:PURCHASE]->(prod)

可能有一种简单的方法来完成它。但是我在网上没有找到任何参考资料。谢谢。
2个回答

7
您不能使用动态关系类型。但是,通过有条件地将数组填充为1或0元素并应用FOREACH,可以采用一种变通方法:
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file://pathto/product-event.csv" AS csvLine 
FIELDTERMINATOR ','
MERGE ( prod:Product{pid: toInt(csvLine.product_id)} )
MERGE ( usr:User { cid: toInt(csvLine.userid)  })
FOREACH(ignoreMe IN CASE WHEN csvLine.action='VIEW' THEN [1] ELSE [] END | 
    MERGE (usr)-[:VIEW]->(prod) )
FOREACH(ignoreMe IN CASE WHEN csvLine.action='PURCHASE' THEN [1] ELSE [] END | 
    MERGE (usr)-[:PURCHASE]->(prod) )

另请参阅http://www.markhneedham.com/blog/2014/08/22/neo4j-load-csv-handling-empty-columns


这篇文章介绍了如何在Neo4j中处理空列的CSV导入。

1

虽然不完全符合您的要求,但可能是有效的:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file://pathto/product-event.csv" AS csvLine      
FIELDTERMINATOR ',' 
MERGE ( prod:Product{pid: toInt(csvLine.product_id)} )   
MERGE ( usr:User { cid: toInt(csvLine.userid)  }) 
MERGE (usr)-[:action {type: csvLine.action}]->(prod) )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接