我正在通过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中创建节点?这是我从上面的查询/合并/加载中得到的图像。
答案 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
既包含承包商名称又包含公司名称,则包含cpn
和line
,或者cn
,或者答案 1 :(得分:0)
您使用相同的CSV来合并多个节点和合并关系,但同时做得太多。
相反,尝试进行多次遍历,每个节点类型一次(如果值为null,则进行适当的过滤),然后在创建所有节点时,使用MATCH而不是MERGE对关系进行另一遍遍。
另一个选择(对于将来很有可能)是拥有多个单独的CSV,每个节点类型一个,然后每个关系一个CSV。