Neo4j-图为空

时间:2019-05-15 18:30:09

标签: neo4j cypher

我正在通过csv在Neo4j中创建节点和关系。我有三列,其中两列为空值。每当我输入“ WHERE NOT line.column_name IS null”时,它都不会为已填充的其他节点提供图形。好像它根本不包含空的那一行。我是密码和图形数据库概念的新手。

csv数据示例:

manager_name,contractor_name,company_name
"John Smith","Matt Potter",Google
"John Smith","Ann Potter",Google
"Andy Jacobs","Matt Potter",Apple
"Seth Jacobs","Mike Smith",
"Seth Jacobs",,LinkedIn

查询使用:

LOAD CSV WITH HEADERS FROM "file:///sample2.csv" AS line
WITH line WHERE NOT line.company_name IS NULL
WITH line WHERE NOT line.contractor_name IS NULL
MERGE (mn:manager_name {name:line.manager_name})
MERGE (cn:contractor_name {name:line.contractor_name})
MERGE (cpn:company_name {name:line.company_name})
MERGE (mn)-[:KNOWS]->(cn)
MERGE (cn)-[:AFFILIATED]->(cpn)

输出问题: 给定我创建的关系,我认为对我来说很明显为什么它不会为"Seth Jacobs",,LinkedIn创建节点,因为contractor_name没有空。 但是,当contract_number在此处不为空时,如何建立连接"Seth Jacobs","Mike Smith",

Seth Jacobs -- KNOWS --> Mike Smith

是否必须填充所有行才能在neo4j中创建节点?这是我从上面的查询/合并/加载中得到的图像。

enter image description here

2 个答案:

答案 0 :(得分:0)

这里的APOC步骤apoc.do.case会很有帮助。

LOAD CSV WITH HEADERS FROM "file:///sample2.csv" AS line
MERGE (mn:manager_name {name: line.manager_name})
WITH mn, line
CALL apoc.do.case(
  [line.contractor_name IS NOT NULL AND line.company_name IS NOT NULL,
     "MERGE (cn:contractor_name {name:line.contractor_name})
      MERGE (cpn:company_name {name:line.company_name})
      MERGE (mn)-[:KNOWS]->(cn)
      MERGE (cn)-[:AFFILIATED]->(cpn)
      RETURN cn, cpn",
   line.contractor_name IS NOT NULL,
     "MERGE (cn:contractor_name {name:line.contractor_name})
      MERGE (mn)-[:KNOWS]->(cn)
      RETURN cn"
  ],
  '',
  {mn: mn, line: line}) YIELD value AS result
RETURN mn, result

在此示例查询中,返回的result将:

  • 如果cn既包含承包商名称又包含公司名称,则包含cpnline,或者
  • 如果该行仅具有承包商名称,则仅包含cn,或者
  • 否则为空。

答案 1 :(得分:0)

您使用相同的CSV来合并多个节点和合并关系,但同时做得太多。

相反,尝试进行多次遍历,每个节点类型一次(如果值为null,则进行适当的过滤),然后在创建所有节点时,使用MATCH而不是MERGE对关系进行另一遍遍。

另一个选择(对于将来很有可能)是拥有多个单独的CSV,每个节点类型一个,然后每个关系一个CSV。