当给定的“m”数据在一个csv列中构造时,如何在neo4j中创建节点并形成n到m的关系?

qlzsbp2j  于 2023-10-18  发布在  其他
关注(0)|答案(1)|浏览(145)

我想在neo4j中设计一个数据库,我想在其中创建节点和其他节点之间的关系。为了解释清楚,请考虑以下场景:
在给定的csv文件中,一列表示唯一的ID,另一列表示类,其中在某些类列中只有一个类,而在许多列中有许多类。

---------------------
|  ID   |  Class    |
---------------------
|  ID1  |  Class-A  |
---------------------
|  ID2  |  Class-A  |
|       |  Class-B  |
|       |  Class-C  |
---------------------

根据上面的示例数据,查询必须生成具有HAS关系的(ID1)节点和(Class-A)节点。ID2也一样。(ID2)--[HAS]-->(Class-A)(ID2)--[HAS]-->(Class-B)等等。
我可以写以下查询。

load csv with headers from 'path' as line
match(id:ID{id:line.ID}), (temp:TEMP{id:line.Class})
    with temp, split(temp.id, " ") as ids
    unwind range(0,size(ids)-1) as i
merge(id)-[n:HAS]->(class:CLASS{id:ids[i]})
delete temp
return n

我能够从Class列创建单个节点,但它创建的是空节点而不是关联ID的关系。
任何线索都会有很大帮助。
我是数据库设计新手。谢谢

ddrv8njm

ddrv8njm1#

您需要仔细阅读MERGE子句文档,因为它很容易被错误地使用并得到意想不到的结果。例如,单个节点和关系应该始终分别为MERGE d。
此外,由于您在开始时查询MATCH es Id节点,因此CSV文件中提到的所有Id节点必须已经存在,否则某些line s将不起任何作用。目前尚不清楚这是否是故意的。
下面是一个应该按预期工作的查询(并根据需要创建Id节点)。请注意,我将节点标签更改为混合大小写,以匹配标准neo4j命名约定。此外,不需要临时节点。

LOAD CSV WITH HEADERS FROM 'path' AS line
MERGE (id:Id {id: line.ID})
WITH line, id
UNWIND SPLIT(line.Class, " ") AS cId
MERGE (class:Class {id: cId})
MERGE (id)-[r:HAS]->(class)
RETURN r

相关问题