是否可以在 cypher 中使用导入功能根据 csv 的值在节点之间创建不同的关系。
例如:
对于给定的 csv 数据
product_id user_id action
1 1 VIEW
1 2 PURCHASE
我需要创建产品节点(product_id)、用户节点(user_id)以及“查看”或“购买”关系user' and product基于 ' 的值的节点action' csv 中的字段。
以下是我尝试过的方法。我知道语法不正确,但只是为了说明我想要做什么。
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)
也许有简单的方法可以做到这一点。但我在网上没有得到任何参考。谢谢。
您不能拥有动态关系类型。然而,有一个解决方法,即有条件地用 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 http://www.markhneedham.com/blog/2014/08/22/neo4j-load-csv-handling-empty-columns.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)