我们在代码中创建查询是通过在查询语法中连接字符串来创建一个节点,在运行时添加查询中的所有属性。
查询在
代码中是这样的nodeLabel = String
properties = JSONObject
String query = "CREATE (n:" + nodeLabel + "{" + properties
+ "}) RETURN n";
执行查询时出错 (n:quiz{name:"1506077464525",createtime:1506077464525,title:"bernoulli's theory",duration:15,privacy:"follower",status:"draft"}) return n with params {}
因为它不允许在java代码中的查询中使用撇号(')。
在neo4j浏览器上执行相同的查询,但在尝试通过代码时没有执行相同的查询。
如何解决此问题并允许相同的内容。
问题2: - 更新节点属性时出现同样的问题。
我尝试编码,但它给了我序列化的错误。
Connection connect = null;
int status = 00;
try {
connect = graphdbConnect();
StringBuilder sb = new StringBuilder();
for (Object key : propertiesMap.keySet()) {
if (sb.length() != 0) {
sb.append(",");
}
sb.append("n." + key + " = " + propertiesMap.get(key));
System.out.println(sb);
}
String query = "match (n{name:'" + nodeName + "'}) set {1}"
+ " return n.name";
query=query.toLowerCase();
try (PreparedStatement preparedStatement = connect.prepareStatement(query)){
preparedStatement.setObject(1,sb);
System.out.println(query+" ---> query");
preparedStatement.executeQuery();
status = ServerStatusReport.OK();
} catch (SQLException e) {
e.printStackTrace();
}
错误: - 执行查询匹配的错误(n {name:' 1506160405300'})设置n。{1} 使用params返回n.name {1 = n.title = Asjdkjsbd' s} at at org.neo4j.jdbc.Neo4jConnection.executeQuery(Neo4jConnection.java:372) 在 org.neo4j.jdbc.Neo4jPreparedStatement.executeQuery(Neo4jPreparedStatement.java:46) 在 com.edubot.server.Neo4jQueries.updateNodeProperty1(Neo4jQueries.java:622) 在 com.edubot.server.course.CourseNeo4jQueries.updateCourseTitle(CourseNeo4jQueries.java:490) 在 com.edubot.server.course.CourseServiceImpl.updateCourseTitle(CourseServiceImpl.java:1215) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(未知来源)at sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)at java.lang.reflect.Method.invoke(未知来源)at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:587) 在 com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:333) 在 com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:303) 在 com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:373) 在 com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62) 在javax.servlet.http.HttpServlet.service(HttpServlet.java:648)at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)at at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:812) 在 org.eclipse.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1669) 在com.edubot.server.CORSFilter.doFilter(CORSFilter.java:51)at org.eclipse.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1652) 在 org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585) 在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) 在 org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577) 在 org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223) 在 org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127) 在 org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515) 在 org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) 在 org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061) 在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) 在 org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) 在 org.eclipse.jetty.server.handler.RequestLogHandler.handle(RequestLogHandler.java:95) 在 org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) 在org.eclipse.jetty.server.Server.handle(Server.java:499)at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:311)at at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257) 在 org.eclipse.jetty.io.AbstractConnection $ 2.run(AbstractConnection.java:544) 在 org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635) 在 org.eclipse.jetty.util.thread.QueuedThreadPool $ 3.run(QueuedThreadPool.java:555) 在java.lang.Thread.run(未知来源)引起: java.lang.IllegalArgumentException:无法序列化值1 n.title = Asjdkjsbd的 org.neo4j.jdbc.rest.JsonUtils.serialize(JsonUtils.java:101)at org.neo4j.jdbc.rest.Statement.toJson(Statement.java:48)at org.neo4j.jdbc.rest.Statement.toJson(Statement.java:68)at org.neo4j.jdbc.rest.TransactionalQueryExecutor.post(TransactionalQueryExecutor.java:112) 在 org.neo4j.jdbc.rest.TransactionalQueryExecutor.commit(TransactionalQueryExecutor.java:135) 在 org.neo4j.jdbc.rest.TransactionalQueryExecutor.executeQueries(TransactionalQueryExecutor.java:198) 在 org.neo4j.jdbc.rest.TransactionalQueryExecutor.executeQuery(TransactionalQueryExecutor.java:208) 在 org.neo4j.jdbc.Neo4jConnection.executeQuery(Neo4jConnection.java:363) ......还有38个
答案 0 :(得分:2)
对于标签,请使用docs on label names所述的反引号(`)。
您可以将属性打包到Java地图和pass it as a parameter。如果您使用的是Java驱动程序,则此处为how to pass parameters。
请注意,参数语法在版本3.2中已更改 - 参数文档页面上有更多信息。
答案 1 :(得分:0)
这是我用来将字符串转换为Cypher安全引用字符串的函数。你这样做很容易注射。这应该可以捕获代码中的实际错误。
if (!str.contains("\"")) {
str= '"' + str + '"';
} else if (!str.contains("'")) {
str= "'" + str + "'";
} else {
str= '"' + str.replaceAll("\"", "\"+'\"'+\"").replaceAll("\\+\"\"|\"\"\\+", "") + '"';
}