我有以下带有标题的数据集我正在使用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的值与其他类别之间的关系。
我也不需要在负载上执行这些功能。感谢。
答案 0 :(得分:1)
目前没有直接的方法来处理动态关系类型。处理它的方法是:
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
条件匹配时的关系。