neo4j导入集关系

时间:2015-12-09 19:26:20

标签: neo4j cypher

我有以下带有标题的数据集我正在使用neo4j来创建图形数据库:

 context_id,    item_type,  category
 u1,            product,    TVs
 u1,            THX,        TVs
 u2,            THX,        Receivers
 u2,            product,    PS4
 u2,            product,    Receivers

代码:

 LOAD CSV WITH HEADERS FROM 'file:///Users/neo4j.csv' AS line
 WITH line
 MERGE (cust:Cust { c_id: line.context_id})
 CREATE (cat:Cat {cat_nm: line.category})
 CREATE (cust)-[r:ACTION{type:line.item_type}]->(cat);

这个过程,但它有两个我想解决的问题:

1)这个关系刚刚叫做ACTION,我想要两个关系,“产品”和“THX” 2)另一个,现在的类别不是节点,我相信它们应该是。

我想要context_id和category的节点。这样我可以看到使用item_type的值与其他类别之间的关系。

我也不需要在负载上执行这些功能。感谢。

2 个答案:

答案 0 :(得分:1)

目前没有直接的方法来处理动态关系类型。处理它的方法是:

  1. 为每种关系类型(THX,产品)创建单独的csv文件
  2. 使用http://www.markhneedham.com/blog/2014/06/17/neo4j-load-csv-handling-conditionals/
  3. 中描述的着名FOREACH ... CASE WHEN技巧

    对于您的第二个问题,您必须提供有关如何连接类别的更多信息,此信息不在csv中。

答案 1 :(得分:1)

我假设当item_type的值是"产品"您希望关系类型为:PRODUCT,而item_type为" THX you want the relationship type to be:THX`。

由于关系类型无法在Cypher中参数化,因此您可以使用以下内容来完成此操作:

LOAD CSV WITH HEADERS FROM 'file:///Users/neo4j.csv' AS line
WITH line
MERGE (cust:Cust { c_id: line.context_id})
MERGE (cat:Cat {cat_nm: line.category})
FOREACH (r IN (CASE WHEN line.item_type = "product" THEN [1] ELSE [] END) |
    CREATE (cust)-[:Product]->(cat))
FOREACH (r in (CASE WHEN line.item_type = "THX" THEN [1] ELSE [] END) |
    CREATE (cust)-[:THX]->(cat))

请注意,当条件为true时,我们使用CASE子句用一个元素填充数组,然后使用FOREACH迭代该数组的元素(单个虚拟项)以创建我们的CASE条件匹配时的关系。