我有一個使用Neo4j數據庫的大型應用程序。有幾十種方法可以支持Cypher查詢。爲了刪除重複的代碼,如果每個方法都存儲它自己的完整查詢,那麼我就創建了私有方法來構建查詢的小常用塊。例如,像一個方法:通過添加WHERE
或RETURN
語句來建立一個完整的查詢方法有沒有辦法將多個WHERE語句鏈接在一起,而無需在Neo4j中切換到AND?
MATCH (node:label)
然後將這些方法調用如下:
MatchNodesWithLabel(string label)
將返回像部分查詢。這是一個小例子,有一些方法可以匹配和過濾整套節點和關係。
,就會出現問題,當多個WHERE
語句需要被鏈接在一起。 Cypher支架不允許WHERE
聲明遵循WHERE
聲明:
// Invalid
MATCH (node)
WHERE node:label
WHERE node.property = value
...
所以過去的第一WHERE
任何方法都必須插入一個AND
語句來代替:
// Valid
MATCH (node)
WHERE node:label
AND node.property = value
AND ...
這將創建一個方法排序問題,其中其他方法不能使用某些方法。插入WHERE
語句(方法Where()
)的方法必須先於And()
方法。 Where()
方法然後可以不是And()
方法之後被使用,並且And()
方法不能之前Where()
方法中使用。
下面是一些可能(但最終打破)的解決方案,我想出瞭解決這個問題的排序:
- 重複每
Where()
法成等價的AndWhere()
方法,做同樣的過濾,但使用AND
而不是WHERE
。然後在調用代碼中,先使用一個Where()
方法,然後使用AndWhere()
方法。- 這不是因爲重複的代碼可接受的解決方案,並且因爲它調用代碼複雜化。它只是將方法排序問題移動到調用代碼,而不是解決問題。我希望能夠添加
Where()
電話時,我想,不用考慮我的方法如何排序
- 這不是因爲重複的代碼可接受的解決方案,並且因爲它調用代碼複雜化。它只是將方法排序問題移動到調用代碼,而不是解決問題。我希望能夠添加
- 所有其他調用之前添加一個
WHERE true
聲明,然後盡一切Where()
方法插入AND
聲明。- 這隻有在調用代碼的方法是明確下令工作。所有
MATCH
方法必須先於WHERE true
,否則你可以用暗號查詢像結束:這是無效的,因爲AND
遵循MATCH
沒有WHERE
MATCH (node) WHERE true AND node:type MATCH (somethingElse) AND somethingElse.property = value
。所以方法排序的責任又一次轉移到了調用代碼上。有了這個解決方案,每次開始一系列新的過濾調用時,您都必須手動添加WHERE true
。
- 這隻有在調用代碼的方法是明確下令工作。所有
- 解析現有的查詢,以確定是否一個
WHERE
或AND
應在每Where()
方法的開始使用。- 起初看起來不錯,你所要做的就是檢查
existingQuery.Contains("WHERE")
,如果它是真的,請插入AND
。然而這與#2有同樣的問題。如果插入新的MATCH
語句,該檢查仍然會返回true,但查詢不會處於AND
是有效語句的狀態。因此,您必須在查詢中進一步解析,檢查MATCH
和WHERE
語句,並且您必須跟蹤它們發生的順序等等。這太複雜了。
- 起初看起來不錯,你所要做的就是檢查
是在任何地方插入一些Neo4j的語法,允許一個WHERE
,或查詢的建築解決方案,我碰到有沒有一些?