Cypher支架查詢調用的程序已經在一個事務中執行,並有在Neo4j的沒有嵌套事務:當你打電話db.beginTx()
,你得到現有的事務,它實際上不是必需的,除非你需要Transaction
對象(例如創建鎖)。
無論如何,即使沒有明確記錄,顯然不可能從Neo4j程序中操作模式。您可以說它無法使用
提供對Cypher中不可用的功能(如手動索引和模式自檢)的訪問。
我創建類似你這樣的測試過程:
public class IndexProcedure {
@Context
public GraphDatabaseService db;
@Procedure
@PerformsWrites
public void index(@Name("label") String label, @Name("property") String property) {
db.schema().indexFor(Label.label(label)).on(property).create();
}
}
並運行它從殼中最簡單的Cypher查詢:
CALL my.package.index('Node', 'name');
沒有@PerformsWrite
註釋,我得到以下(預計)例外:
WARN ING:無法調用程序my.package.index
:原因:org.neo4j.graphdb.security.AuthorizationViolationException:對於READ
事務,不允許使用模式操作。
與註釋,我得到相同的異常,因爲你:
警告:未能調用程序my.package.index
:由:org.neo4j.graphdb.QueryExecutionException:不能在事務執行架構更新已執行數據更新。
我想基本原理是設置模式主要是一次性操作,並不真的需要一個過程:如果你要執行一些Cypher查詢來調用過程,你可能會很好地運行創建約束和索引的腳本。
也可能存在技術約束:索引創建是異步的,可能不參與事務(您是否可以回滾索引的創建?)。
或者它可能只是一個錯誤?我們應該從Neo找人來確認。
更新:將所謂固定在Neo4j的3.1時,它的發佈,每一個討論SlackHQ。
beginTx()中的第一條語句是創建Constraints,然後是索引,然後創建Nodes,它們都在它自己的事務中......我從不更新任何數據......請不要,第一件事我做我的過程是從json文件中獲取約束(標籤和屬性)信息,然後創建一個查詢字符串...並調用執行/運行方法...多數民衆贊成我只是在做........... ..我沒有更新約束之前的任何數據調用 – NeoMan
只是想通過更新數據瞭解你的意思是什麼?這是否意味着Neo4j DB數據更新或任何實用程序操作?如果你說我甚至試圖運行只執行約束命令......就是這樣......我得到同樣的例外。 – NeoMan
該過程由Cypher查詢調用。除了'CALL my.procedure()'以外,查詢中還有什麼? –