2013-11-24 68 views
1

在Neo4j的2.0.0-M05我用來做Neo4j 2.0.0-RC1每個關係的可選關係被刪除?

START n=node(*) MATCH n-[r?]-() WHERE ID(n) <> 0 AND ID(n) <> 1 DELETE n, r 

要刪除整個數據庫除節點0和1.現在Noe4j 2.0.0-RC1,我不能再使用了問號。而是我必須使用可選關鍵字這樣的:

START n=node(*) OPTIONAL MATCH n-[r]-() WHERE ID(n) <> 0 AND ID(n) <> 1 DELETE n, r 

1題

它匹配節點1

neo4j-sh (?)$ START n=node(*) OPTIONAL MATCH n-[r]-() WHERE ID(n) <> 1 RETURN n, r; 
+--------------------+ 
| n   | r  | 
+--------------------+ 
| Node[1]{} | <null> | 
+--------------------+ 
(節點0在查詢的時刻是不存在於數據庫中)

這當然不僅僅是這個查詢的問題,而是整個應用程序中我需要使用類似的查詢。

問題2

由於它在我看來這引入了嚴重的設計缺陷。也許我的推理是關閉的,而且由於問題1我還無法測試它。但OPTIONAL關鍵字嚴重限制了查詢的可能性。正如在這裏公告所寫的,http://blog.neo4j.org/2013/11/neo4j-200-rc1-final-preparations.htmlOPTIONAL可以比作OUTER JOIN。爲了跟上這種從節點到節點的跳變,就像增加一個額外的連接一樣。

所以

MATCH (a)-[x]-(b)-[y?]-(c) RETURN a, b, c 

會像做

SELECT a, b, c FROM ?? 
INNER JOIN x ON ?? 
LEFT OUTER JOIN y ON ?? 

(到位問號,因爲暗號不轉化爲SQL)
但不可用可選關鍵字要麼你讓所有的加入OUTER JOIN或所有加入INNER JOIN(沒有可選關鍵字)。沒有混合的內部/外部連接查詢,我的應用程序不起作用。對我來說,使關係可選PER HOP是非常基本的。所以要麼我必須留在M06(支持問號的最新版本)或嘗試其他數據庫。

簽名,

絕望的開發人員。

回答

2

請提供一些樣品數據和預期結果。我很確定你的兩個查詢可以用下面的可選匹配重寫。

你的WHERE子句奇怪地行爲的原因是因爲直接跟隨OPTIONAL MATCH的WHERE只在OPTIONAL MATCH匹配某個東西時才運行,作爲該OPTIONAL MATCH的一個過濾器。所以在這種情況下,你找到n(id = 1),它不匹配n- [r] - (),因爲n沒有關係,然後返回n。你需要首先過濾你的n,儘管我建議只使用MATCH而不是START(在這種情況下,這並不重要,但通常MATCH更好)。

爲了您的#1,你需要做的查詢,而不是:

MATCH (n) 
WHERE ID(n) <> 1 
OPTIONAL MATCH n-[r]-() 
RETURN n, r; 

爲了您的#2:

MATCH (a)-[x]-(b) 
OPTIONAL MATCH (b)-[y]-(c) 
RETURN a, b, c // c will be null if it doesn't exist 
+0

非常感謝你,一切都與你的查詢解決。信仰已經恢復!事情開始再次匹配感覺:)謝謝。 – Flip

+0

沒問題。我剛剛發佈了這個:http://wes.skeweredrook.com/cypher-2-0-optional-match/ –