2016-09-15 22 views
0

這是否意味着我們不能通過Java API調用這樣的事情? 我收到錯誤 - 「由於:org.neo4j.graphdb.QueryExecutionException:無法在執行數據更新的事務中執行模式更新。」 當我通過neo4j控制檯從過程調用中調用模式更新時,會發生這種情況。Neo4j - 如何分別管理模式和數據事務?

try (Transaction tx = db.beginTx()) { 
    String query = "CREATE INDEX ON :" + lbl + "(" + name + ")"; 
    db.execute(query); 
    tx.success(); 
} 

回答

0

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。

+0

beginTx()中的第一條語句是創建Constraints,然後是索引,然後創建Nodes,它們都在它自己的事務中......我從不更新任何數據......請不要,第一件事我做我的過程是從json文件中獲取約束(標籤和屬性)信息,然後創建一個查詢字符串...並調用執行/運行方法...多數民衆贊成我只是在做........... ..我沒有更新約束之前的任何數據調用 – NeoMan

+0

只是想通過更新數據瞭解你的意思是什麼?這是否意味着Neo4j DB數據更新或任何實用程序操作?如果你說我甚至試圖運行只執行約束命令......就是這樣......我得到同樣的例外。 – NeoMan

+0

該過程由Cypher查詢調用。除了'CALL my.procedure()'以外,查詢中還有什麼? –