我时不时地发现自己想将CSV文件导入Neo4j,而我总是对如何处理可能潜伏在其中的各种空值感到困惑。
让我们从一个没有CSV文件的示例开始。 考虑以下列表,以及我尝试仅返回空值的尝试:
WITH [null, "null", "", "Mark"] AS values
UNWIND values AS value
WITH value WHERE value = null
RETURN value(no changes, no records)
WITH [null,“ null”,“”,“ Mark”] AS值UNWIND值AS值WITH值WHERE值= null RETURN值(无更改,无记录)
嗯,这很奇怪。 我曾期望至少将第一个值保留在集合中。 如果我们做相反的事情呢?
WITH [null, "null", "", "Mark"] AS values
UNWIND values AS value
WITH value WHERE value <> null
RETURN value(no changes, no records)
WITH [null,“ null”,“”,“ Mark”] AS值UNWIND值AS值WITH值WHERE值<> null RETURN值(无更改,无记录)
依然没有! 让我们尝试返回比较的输出,而不是过滤行:
WITH [null, "null", "", "Mark"] AS values
UNWIND values AS value
RETURN value = null AS outcome╒═══════╤═════════╕
│"value"│"outcome"│
╞═══════╪═════════╡
│null │null │
├───────┼─────────┤
│"null" │null │
├───────┼─────────┤
│"" │null │
├───────┼─────────┤
│"Mark" │null │
└───────┴─────────┘
好的,这不是我们所期望的。 一切都有“空”的“结果”! 如果我们要检查值是否为字符串“ Mark”,该怎么办?
WITH [null, "null", "", "Mark"] AS values
UNWIND values AS value
RETURN value = "Mark" AS outcome╒═══════╤═════════╕
│"value"│"outcome"│
╞═══════╪═════════╡
│null │null │
├───────┼─────────┤
│"null" │false │
├───────┼─────────┤
│"" │false │
├───────┼─────────┤
│"Mark" │true │
└───────┴─────────┘
通过执行此查询,我们了解到,如果比较的一侧为null,则返回值将始终为null。
那么,如果行为空,我们如何排除呢?
事实证明,我们必须使用'is'关键字而不是使用等于运算符。 让我们看看它是什么样的:
WITH [null, "null", "", "Mark"] AS values
UNWIND values AS value
WITH value WHERE value is null
RETURN value╒═══════╕
│"value"│
╞═══════╡
│null │
└───────┘
和积极的情况:
WITH [null, "null", "", "Mark"] AS values
UNWIND values AS value
WITH value WHERE value is not null
RETURN value╒═══════╕
│"value"│
╞═══════╡
│"null" │
├───────┤
│"" │
├───────┤
│"Mark" │
└───────┘
如果我们想摆脱空字符串怎么办?
WITH [null, "null", "", "Mark"] AS values
UNWIND values AS value
WITH value WHERE value <> ""
RETURN value╒═══════╕
│"value"│
╞═══════╡
│"null" │
├───────┤
│"Mark" │
└───────┘
有趣的是,这也摆脱了我没想到的空值。 但是,如果我们寻找与空字符串匹配的值:
WITH [null, "null", "", "Mark"] AS values
UNWIND values AS value
WITH value WHERE value = ""
RETURN value╒═══════╕
│"value"│
╞═══════╡
│"" │
└───────┘
也不在那里! 嗯,这是怎么回事:
WITH [null, "null", "", "Mark"] AS values
UNWIND values AS value
RETURN value, value = "" AS isEmpty, value <> "" AS isNotEmpty╒═══════╤═════════╤════════════╕
│"value"│"isEmpty"│"isNotEmpty"│
╞═══════╪═════════╪════════════╡
│null │null │null │
├───────┼─────────┼────────────┤
│"null" │false │true │
├───────┼─────────┼────────────┤
│"" │true │false │
├───────┼─────────┼────────────┤
│"Mark" │false │true │
└───────┴─────────┴────────────┘
除非我们显式检查值“为空”,否则对于每种等式匹配,空值似乎都会被过滤掉。
那么,当我们使用Neo4j的LOAD CSV工具解析CSV文件时,如何利用这些知识呢?
假设我们有一个CSV文件,如下所示:
$ cat nulls.csv
name,company
"Mark",
"Michael",""
"Will",null
"Ryan","Neo4j"
$ cat nulls.csv名称,公司“ Mark”,“ Michael”,“” Will”,空“ Ryan”,“ Neo4j”
因此,前三行都没有“ company”的值。 我根本没有任何值,Michael有一个空字符串,Will有一个空值。 让我们看看LOAD CSV是如何解释的:
load csv with headers from "file:///nulls.csv" AS row
RETURN row╒═════════════════════════════════╕
│"row" │
╞═════════════════════════════════╡
│{"name":"Mark","company":null} │
├─────────────────────────────────┤
│{"name":"Michael","company":""} │
├─────────────────────────────────┤
│{"name":"Will","company":"null"} │
├─────────────────────────────────┤
│{"name":"Ryan","company":"Neo4j"}│
└─────────────────────────────────┘
我们已经从上面全面了解了所有组合。 我们想为每行创建一个Person节点,但仅在定义了实际公司的情况下才创建Company节点和关联的“ WORKS_FOR”关系hp –我们不想创建一个空公司。
因此,我们只想为Ryan行创建一个公司节点和'WORKS_FOR'关系。
以下查询可以解决问题:
load csv with headers from "file:///nulls.csv" AS row
MERGE (p:Person {name: row.name})
WITH p, row
WHERE row.company <> "" AND row.company <> "null"
MERGE (c:Company {name: row.company})
MERGE (p)-[:WORKS_FOR]->(c)Added 5 labels, created 5 nodes, set 5 properties, created 1 relationship, statement completed in 117 ms.
使用“ file:///nulls.csv”中的标头加载csv AS行合并(p:Person {name:row.name})WITH p,row WHERE row.company <>“” AND row.company <>“ null ” MERGE(c:Company {name:row.company})MERGE(p)-[:WORKS_FOR]->(c)添加了5个标签,创建了5个节点,设置了5个属性,创建了1个关系,语句在117毫秒内完成。
如果我们可视化所创建的内容:
完善。 也许这种行为是显而易见的,但它总是让我感到震惊,因此希望它对其他人也有用!
翻译自: https://www.javacodegeeks.com/2017/02/neo4j-null-values-even-work.html