Neo4j:空值如何工作?
我時不時地發現自己想將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
總結
以上是生活随笔為你收集整理的Neo4j:空值如何工作?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信视频美颜怎么开
- 下一篇: 嘴巴英语怎么读 嘴巴的英语是什么