2017-09-22 2 views
0

Nous créons une requête dans notre code en concaténant des chaînes dans la syntaxe de la requête comme pour créer un noeud toutes les propriétés de la requête sont ajoutées au moment de l'exécution.Cypher Query: - Autoriser apostrope (') contenant String dans la requête

The query is like this in the code where

nodeLabel =String

properties = JSONObject

String query = "CREATE (n:" + nodeLabel + "{" + properties 
        + "}) RETURN n"; 

Erreur exécution créer requête(n:quiz{name:"1506077464525",createtime:1506077464525,title:"bernoulli's theory",duration:15,privacy:"follower",status:"draft"}) return n with params {} parce que son ne permettant pas l'apostrophe (') dans la requête dans le code java.

La même requête est en cours d'exécution sur le navigateur neo4j mais la même requête ne s'exécute pas lors d'une tentative de code.

Comment résoudre ce problème et permettre le même.


Problème 2: - Même problème avec la mise à jour se produit la propriété du nœud.

J'ai essayé de coder mais cela m'a donné une erreur de sérialisation.

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(); 
     } 

Error:-Error executing query match (n{name:'1506160405300'}) set n.{1} return n.name with params {1=n.title = Asjdkjsbd's} at org.neo4j.jdbc.Neo4jConnection.executeQuery(Neo4jConnection.java:372) at org.neo4j.jdbc.Neo4jPreparedStatement.executeQuery(Neo4jPreparedStatement.java:46) at com.edubot.server.Neo4jQueries.updateNodeProperty1(Neo4jQueries.java:622) at com.edubot.server.course.CourseNeo4jQueries.updateCourseTitle(CourseNeo4jQueries.java:490) at com.edubot.server.course.CourseServiceImpl.updateCourseTitle(CourseServiceImpl.java:1215) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:587) at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:333) at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:303) at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:373) at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62) at javax.servlet.http.HttpServlet.service(HttpServlet.java:648) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:812) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1669) at com.edubot.server.CORSFilter.doFilter(CORSFilter.java:51) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577) at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223) at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127) at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515) at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) at org.eclipse.jetty.server.handler.RequestLogHandler.handle(RequestLogHandler.java:95) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) at org.eclipse.jetty.server.Server.handle(Server.java:499) at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:311) at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257) at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:544) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635) at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.IllegalArgumentException: Could not serialize value 1 n.title = Asjdkjsbd's at 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) at org.neo4j.jdbc.rest.TransactionalQueryExecutor.commit(TransactionalQueryExecutor.java:135) at org.neo4j.jdbc.rest.TransactionalQueryExecutor.executeQueries(TransactionalQueryExecutor.java:198) at org.neo4j.jdbc.rest.TransactionalQueryExecutor.executeQuery(TransactionalQueryExecutor.java:208) at org.neo4j.jdbc.Neo4jConnection.executeQuery(Neo4jConnection.java:363) ... 38 more

+0

Pouvez-vous inclure le message d'erreur réel? Et cette requête génère-t-elle l'impression du chiffre généré par votre code? J'ai fourni une réponse qui devrait attraper tous les problèmes dans Cypher Strings. – Tezra

Répondre

1
  1. Pour les étiquettes, l'utilisation backticks (') comme décrit par le docs on label names.

  2. Vous pouvez regrouper les propriétés dans une carte Java et pass it as a parameter. Si vous utilisez le pilote Java, voici how to pass parameters.

    Notez que la syntaxe des paramètres a changé dans la version 3.2 - la page Documentation de paramètres contient plus d'informations à ce sujet.

0

Voici la fonction que j'utilise pour convertir une chaîne en une chaîne entre guillemets Cypher-safe. La façon dont vous le faites est vulnérable à l'injection. Cela devrait capturer quelle que soit l'erreur réelle dans votre code.

if (!str.contains("\"")) { 
    str= '"' + str + '"'; 
} else if (!str.contains("'")) { 
    str= "'" + str + "'"; 
} else { 
    str= '"' + str.replaceAll("\"", "\"+'\"'+\"").replaceAll("\\+\"\"|\"\"\\+", "") + '"'; 
}