【问题标题】:Can I use this CSV to load a neo4j graph with cypher?我可以使用这个 CSV 加载带有密码的 neo4j 图表吗?
【发布时间】:2018-02-04 08:49:11
【问题描述】:

我是一名医生,试图将药物建模到酶数据库中,并从我用来将数据加载到 Gephi 图形布局程序中的 CSV 文件开始。我了解图形数据库的强大功能,但对密码一窍不通:

当前的 CSV 格式如下:

source;target;arc_type; <- this is an header needed for Gephi import
artemisinin;2B6;induces;
...
amiodarone;1A2;represses;
...
3A457;carbamazepine;metabolizes;

这些示例记录显示了三种类型的关系。药物可以抑制或增强细胞色素,细胞色素代谢药物。

有没有办法按原样使用这个 CSV 来加载到 neo4j 并创建图表?

非常感谢。

【问题讨论】:

  • 节点也有类型吗?
  • 是的,该图是具有两种类型节点的二分图:细胞色素和异生素(该术语包括药物和其他生物活性物质,例如烟草)。细胞色素和异种生物之间只有边缘。

标签: graph neo4j cypher


【解决方案1】:

在 neo4j 术语中,relationship 必须具有“类型”,并且节点可以具有任意数量的 labels。看起来您的用例可以从使用DrugCytochrome 标记您的节点中受益。

这是您的用例可能的 neo4j 数据模型:

(:Drug)-[:MODULATES {induces: false}]->(:Cytochrome)
(:Cytochrome)-[:METABOLIZES]->(:Drug)

induces 属性具有一个布尔值,指示药物是诱导 (true) 还是抑制 (false) 相关的细胞色素。

以下是从您的 CSV 文件生成上述数据模型的(有些复杂的)查询:

USING PERIODIC COMMIT 500
LOAD CSV WITH HEADERS FROM 'file:///Drugs.csv' AS line FIELDTERMINATOR ';'
WITH line,
  CASE line.arc_type
    WHEN 'metabolizes' THEN {a: [1]}
    WHEN 'induces' THEN {b: [true]}
    ELSE {b: [false]}
  END AS todo
FOREACH (ignored IN todo.a |
  MERGE (c:Cytochrome {id: line.source})
  MERGE (d:Drug {id: line.target})
  MERGE (c)-[:METABOLIZES]->(d)
)
FOREACH (induces IN todo.b |
  MERGE (d:Drug {id: line.source})
  MERGE (c:Cytochrome {id: line.target})
  MERGE (d)-[:MODULATES {induces: induces}]->(c)
)

如果IN 之后的值为空,则FOREACH 子句不执行任何操作。

【讨论】:

    【解决方案2】:

    是的,这是可能的,但您需要安装 APOC:Neo4j 的有用存储过程列表。你可以在这里找到它:https://neo4j-contrib.github.io/neo4j-apoc-procedures/

    然后您应该将您的 CSV 文件放入 Neo4j 的 import 文件夹中,然后运行这些查询:

    第一个在 :Node(name) 上创建唯一约束:

    CREATE CONSTRAINT ON (n:Node) ASSERT n.name IS UNIQUE;
    

    然后这个查询来导入你的数据:

    USING PERIODIC COMMIT 500
    LOAD CSV WITH HEADERS FROM 'file:///my-csv-file.csv' AS line
      MERGE (n:Node {name:line.source})
      MERGE (m:Node {name:line.target})
      CALL apoc.create.relationship(n, line.arc_type,{​}, m)
    

    【讨论】:

    • 从您的示例开始尝试以下操作:{USING PERIODIC COMMIT 500 LOAD CSV WITH HEADERS FROM 'file:///Users/Bob/dcn_graph_data.csv' AS line WITH MERGE (n:Node {name :line.source}) MERGE (m:Node {name:line.target}) CALL apoc.create.relationship(n, line.arc_type,{}, m) } 但得到以下错误 Invalid input ')': expected空格或关系模式(第 3 行,第 35 列(偏移量:139))“MERGE (n:Node {name:line.source})”
    • @RobertAlexander 你不能这样做WITH MERGE, WITH 是它自己的子句,你这里至少需要一个变量,或者完全去掉 WITH
    • 在没有 WITH 子句的情况下编写它会引发错误。另一个例子运行良好。非常感谢。
    猜你喜欢
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2011-08-05
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多