我想使用Java创建neo4j的节点,但我遇到了一些错误
Cannot perform data updates in a transaction that has performed schema updates
org.neo4j.graphdb.ConstraintViolationException: Cannot perform data updates in a transaction that has performed schema updates.
at org.neo4j.kernel.InternalAbstractGraphDatabase.createNode(InternalAbstractGraphDatabase.java:1152)
at neo4j.bis.beans.HelloWorld.addNodes(HelloWorld.java:51)
at neo4j.bis.beans.InsertNodes.doPost(InsertNodes.java:39)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.neo4j.kernel.api.exceptions.InvalidTransactionTypeKernelException: Cannot perform data updates in a transaction that has performed schema updates.
at org.neo4j.kernel.impl.api.KernelTransactionImplementation$TransactionType$2.upgradeToDataTransaction(KernelTransactionImplementation.java:517)
at org.neo4j.kernel.impl.api.KernelTransactionImplementation.upgradeToDataTransaction(KernelTransactionImplementation.java:221)
at org.neo4j.kernel.impl.api.KernelStatement.dataWriteOperations(KernelStatement.java:83)
at org.neo4j.kernel.InternalAbstractGraphDatabase.createNode(InternalAbstractGraphDatabase.java:1127)
... 23 more
java.lang.RuntimeException: Error starting org.neo4j.kernel.EmbeddedGraphDatabase, /var/lib/neo4j/data
at org.neo4j.kernel.InternalAbstractGraphDatabase.run(InternalAbstractGraphDatabase.java:362)
at org.neo4j.kernel.EmbeddedGraphDatabase.<init>(EmbeddedGraphDatabase.java:59)
at org.neo4j.graphdb.factory.GraphDatabaseFactory$1.newDatabase(GraphDatabaseFactory.java:90)
at org.neo4j.graphdb.factory.GraphDatabaseBuilder.newGraphDatabase(GraphDatabaseBuilder.java:199)
at org.neo4j.graphdb.factory.GraphDatabaseFactory.newEmbeddedDatabase(GraphDatabaseFactory.java:70)
at neo4j.bis.beans.HelloWorld.findUserById(HelloWorld.java:65)
at neo4j.bis.beans.InsertNodes.doPost(InsertNodes.java:40)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.neo4j.kernel.lifecycle.LifecycleException: Component 'org.neo4j.kernel.StoreLockerLifecycleAdapter@1187b14' was successfully initialized, but failed to start. Please see attached cause exception.
at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:513)
at org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:115)
at org.neo4j.kernel.InternalAbstractGraphDatabase.run(InternalAbstractGraphDatabase.java:339)
... 27 more
Caused by: org.neo4j.kernel.StoreLockException: Unable to obtain lock on store lock file: /var/lib/neo4j/data/store_lock. Please ensure no other process is using this database, and that the directory is writable (required even for read-only access)
at org.neo4j.kernel.StoreLocker.checkLock(StoreLocker.java:78)
at org.neo4j.kernel.StoreLockerLifecycleAdapter.start(StoreLockerLifecycleAdapter.java:44)
at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:507)
... 29 more
Caused by: java.nio.channels.OverlappingFileLockException
at sun.nio.ch.SharedFileLockTable.checkList(FileLockTable.java:255)
at sun.nio.ch.SharedFileLockTable.add(FileLockTable.java:152)
at sun.nio.ch.FileChannelImpl.tryLock(FileChannelImpl.java:1056)
at java.nio.channels.FileChannel.tryLock(FileChannel.java:1154)
at org.neo4j.kernel.impl.nioneo.store.StoreFileChannel.tryLock(StoreFileChannel.java:142)
at org.neo4j.kernel.impl.nioneo.store.FileLock.wrapFileChannelLock(FileLock.java:35)
at org.neo4j.kernel.impl.nioneo.store.FileLock.getOsSpecificFileLock(FileLock.java:93)
at org.neo4j.kernel.DefaultFileSystemAbstraction.tryLock(DefaultFileSystemAbstraction.java:93)
at org.neo4j.kernel.StoreLocker.checkLock(StoreLocker.java:74)
... 31 more
HelloWorld.java
package neo4j.bis.beans;
import java.util.ArrayList;
import org.neo4j.graphdb.DynamicLabel;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.ResourceIterator;
import org.neo4j.graphdb.Transaction;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
import org.neo4j.graphdb.schema.IndexDefinition;
import org.neo4j.graphdb.schema.Schema;
public class HelloWorld {
public HelloWorld() {
}
private static final String Neo4j_DBPath = "/var/lib/neo4j/data/";
private GraphDatabaseService GDBservice;
private org.neo4j.graphdb.Label label;
private Node UserNode;
private Transaction tx;
private Schema schema;
private IndexDefinition index;
private int IdToFind = 45;
private String NameToFind = "user" + IdToFind + "@neo4j.org";
@SuppressWarnings("deprecation")
public void createDB() {
try {
GDBservice = new GraphDatabaseFactory()
.newEmbeddedDatabase(Neo4j_DBPath);
} catch (Exception e) {
e.printStackTrace();
}
}
public void addNodes() {
try {
GDBservice = new GraphDatabaseFactory()
.newEmbeddedDatabase(Neo4j_DBPath);
tx = GDBservice.beginTx();
schema = GDBservice.schema();
index = schema.indexFor(DynamicLabel.label("Emp")).on("EmpName")
.create();
label = DynamicLabel.label("Emp");
// Create Some Users.......
for (int id = 0; id < 50; id++) {
UserNode = GDBservice.createNode(label);
UserNode.setProperty("EmpName", "emp" + id + "@neo4j.org");
}
System.out.println("Employee Created.....");
tx.success();
} catch (Exception e) {
e.printStackTrace();`enter code here`
}
}
}
的servlet srvltCallMethods.java
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
HelloWorld hello=new HelloWorld();
//hello.createDB();
//hello.addNodes();
hello.findUserById();
//hello.removeNodes();
hello.shutDownDB();
}
的index.jsp
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org /TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form method="post" action="srvltCallMethods">
<input type="submit" name="btnsubmit" value="Neo4jNodesExecution"></input>
</form>
</body>
</html>
答案 0 :(得分:0)
正如例外所述,您不能将架构更新(约束,索引创建)与数据更新混合在一起。
因此将两者分开,您还应该将索引/约束创建移动到初始化代码。
你不应该每次都重新创建数据库。
static Label EMP = DynamicLabel.label("Emp");
public void createDB() {
try {
GDBservice = new GraphDatabaseFactory()
.newEmbeddedDatabase(Neo4j_DBPath);
try (Transaction tx = GDBservice.beginTx()) {
GDBservice.schema().indexFor(EMP).on("EmpName")
.create();
tx.success();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void addNodes() {
try (Transaction tx = GDBservice.beginTx()) {
// Create Some Users.......
for (int id = 0; id < 50; id++) {
Node UserNode = GDBservice.createNode(EMP);
UserNode.setProperty("EmpName", "emp" + id + "@neo4j.org");
}
System.out.println("Employee Created.....");
tx.success();
} catch (Exception e) {
e.printStackTrace();
}
}