当前位置: 首页 > 知识库问答 >
问题:

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

戴凯歌
2023-03-14

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

product_id  user_id  action
1           1        VIEW
1           2        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)

可能有简单的方法做这件事。但我在网上没有得到任何参考资料。谢了。

共有1个答案

徐君植
2023-03-14

不能具有动态关系类型。但是,有一种解决办法,可以通过有条件地填充具有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。

 类似资料:
  • 请有人给我指个正确的方向。

  • 问题内容: 我正在用csv快速编写以下数据: 当我完成解析第一个文件并启动第二个文件时,我想添加更多列,如下所示: parsed STEP ID ELEMENT_ID Fatigue SW Fatigue F1 Fatigue F3 Fatigue SW Fatigue F1 Fatigue F3 Step 10 10000 1.30E-07 1.51E-06 2.15E-06 1.30E-07

  • 我试图使用导入CSV创建一组标记节点,如下所示: 是这个功能不起作用,还是只限于导入工具而不是语言?

  • 我使用DataTables作为动态sql连接的方式。我想添加按钮导出csv和xml,但它没有出现。还是我弄错了。 非常感谢。

  • 使用cypher和neo4j 2.0。 给定两组节点ID(长度相等)和一组权重,我想在相应的节点之间创建一个关系,并将权重设置为属性。例如,如果我有以下三个列表: 我想创建以下表示形式 但不是,例如 我可以通过迭代我的参数,然后创建单独的查询来实现这一点。有没有一种方法来批量运行它,将我的lsits作为参数传递,并要求按顺序匹配节点和属性? 我曾一度认为以以下方式使用参数会起作用,但它会创建关系的