【问题标题】:Import selected lines from tsv file into neo4j将 tsv 文件中的选定行导入 neo4j
【发布时间】:2018-09-20 16:45:06
【问题描述】:

我有一个包含这种格式关系的文件:

!comment
!comment
nodeID   nodeName   edgeType   nodeID
nodeID   nodeName   edgeType   nodeID
nodeID   nodeName   edgeType   nodeID

我想将该文件的节点和边导入到我的 neo4j 数据库中。
我尝试了以下步骤:

  1. 在节点 ID 上创建唯一约束
  2. 读取文件,跳过注释行,从每行创建唯一节点(如果节点已存在则跳过行)
  3. 读取文件,跳过注释行,从每一行创建边
// Each node id is unique
CREATE CONSTRAINT ON (n:Node) ASSERT n.id IS UNIQUE

// For each row not starting by "!", create node if it doesn't exist
LOAD CSV FROM "file:///relationships.tsv" AS row
FIELDTERMINATOR '\t'
WITH row
WHERE NOT row =~ '^!.*'
CREATE (:Node {id: row[0], name: row[1]})

// For each row not starting by "!", create edge
LOAD CSV FROM "file:///relationships.tsv" AS row
FIELDTERMINATOR '\t'
WITH row
WHERE NOT row =~ '^!.*'
MATCH (n:Node), (m:Node)
WHERE n.id = row[0] AND m.id = row[3]
WITH n, m, row
CASE row[2]
  WHEN 'F' THEN
    CREATE UNIQUE (m)-[:Edge {type: 'friend'}]->(n)
  WHEN 'P' THEN
    CREATE UNIQUE (m)-[:Edge {type: 'partner'}]->(n)
END

上面的代码不起作用。作为密码新手,我不确定自己做错了什么。我希望最终合并步骤 2 和 3 以读取文件一次并完成它。如何有效地导入这些数据?

【问题讨论】:

  • 你能解释一下什么不起作用吗?导入后有结果吗?
  • 正则表达式不起作用,因为 row 是字符串列表。

标签: neo4j cypher


【解决方案1】:

[更新两次]

这个版本的第三个查询应该可以工作:

LOAD CSV FROM "file:///relationships.tsv" AS row
FIELDTERMINATOR '\t'
WITH row
WHERE NOT row[0] STARTS WITH '!'
MATCH (m:Node)
WHERE m.id = row[3]
MERGE (n:Node {id: row[0]})
SET n.name = row[1]
FOREACH (domain IN
    CASE
        WHEN row[2] = 'F' THEN ['friend']
        WHEN row[2] = 'P' THEN ['partner']
        ELSE []
    END |
    MERGE (t)-[:Edge {type: domain}]->(p)
);

它正确地测试了行中的第一项(不是整行 list -- 这不是一个字符串)的起始“!”。它还使用FOREACH 子句来执行条件更新(Cypher CASE 子句本身不支持)。此查询还使用MERGE,而不是已弃用的CREATE UNIQUE。它还使用MERGE 而不是CREATE 来创建n 节点,以确保您不会产生重复(例如,如果您重新运行相同的查询)。

【讨论】:

  • 我应该指定每个 m:Node 都已经存在于图中。在这种情况下,是否可以将第 2 步和第 3 步结合起来?
  • 如果所有Nodes 确实已经在数据库中,那为什么还需要执行第2 步?
  • 所有 m:Nodes 都已经存在,但 n:Nodes 不存在。第 2 步添加 n:Nodes
  • 在加载 csv 后,我通过读取每一行两次(WITH row ... WITH row ...)成功合并了这两个步骤。
  • 查看我的更新答案。它可能与您想出的不一样。
猜你喜欢
  • 2022-11-04
  • 2015-12-17
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 2015-09-08
相关资源
最近更新 更多