当前位置: 首页 > 知识库问答 >
问题:

密码查询:-允许查询中包含字符串的撇号(')

汤英豪
2023-03-14

我们在代码中创建查询,方法是在查询的语法中连接字符串,就像创建一个节点一样,查询中的所有属性都是在运行时添加的。

查询在代码中如下所示,其中

节点标签=字符串

properties = JSONObject

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

执行查询创建时出错(n:quiz{name:“1506077464525”,创建时间:1506077464525,标题:“伯努利的理论”,持续时间:15,隐私:“追随者”,状态:“草稿”})返回带有参数{},因为它不允许在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} 返回带有参数的 n.name {1=n.title = Asjdkjsbd's} 在 org.neo4j.jdbc.Neo4jConnection.execute 查询(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)课程服务简单更新课程标题(课程服务简单.java:1215) 在太阳反射.本机方法访问调用0(本机方法) 在太阳.反射.本机方法访问调用(未知来源) 在太阳反射.委派方法访问调用(未知来源) 在 java.lang.reflect.方法调用(未知来源).java 在com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:333) at com.google.gwt.user.server.rpc.RemoteService.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.java .java:812) at org.eclipse.jetty.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.ServletHandler.doHandle(ServletHandler.java:585) 在组织日食.eclipse.jetty.server.处理程序.作用域处理程序.处理(作用域处理器.java:143) 在组织.eclipse.jetty.security.securityhandler.handle(安全处理程序.java:577) 在组织日食.jetty.server.session.会话处理程序.doHandle(会话处理程序.java:223) 在组织日食.jetty.server.处理程序.上下文处理程序.doHandle(上下文处理程序.java:1127) 在组织日食.jetty.servlet.servletHandler.doScope(ServletHandler.java:515)组织日食.jetty.server.session.sessionHandler.doScope(会话处理程序.java:185) 在 org.eclipse.jetty.server.处理程序.上下文处理程序.doScope(上下文处理程序.java:1061) 在 org.eclipse.jetty.server.处理程序.作用域处理程序.处理者.java:141) 在组织日食.jetty.jetty.server.处理程序.处理程序(处理程序.java:97) 在 org.eclipse.jetty.server.处理程序.RequestLogHandler.handle(RequestLogHandler.java:95)在组织日食.jetty.server.处理程序.java:97) 在组织日食.jetty.server.server.handle(服务器.java:499) 在 org.eclipse.jetty.server.httpChannel.handle(httpChannel.java:311) 在组织日食.jetty.server.net连接.java在可填充(http连接.java:257) 在组织日.java食.java:635)队列线程池$3.run(队列线程池.java:555) 在 java.lang.thread.run(未知来源) 由: java.lang.非法描述异常: 无法序列化值 1 n.title = Asjdkjsbd's 在组织.neo4j.jdbc.rest.jsonUtils.serialize(JsonUtils.java:101) 在组织.neo4j.jdbc.rest.语句.toJson(语句.java:48).java 在 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.executeQuery(TransactionalQueryExcutor.java:198) at org.neo4j.jdbc.rest.TransactionalQueryExecutor.executeQuery(TransactionalQueryExcutor.execute.java:208) at org.neo4jjconnection.executeQuery(Neo4jConnection.java:363) ...另外 38

共有2个答案

田昊天
2023-03-14

这是我用来将字符串转换为Cypher安全的带引号字符串的函数。您这样做的方式容易受到注入的影响。这应该会捕获代码中的任何实际错误。

if (!str.contains("\"")) {
    str= '"' + str + '"';
} else if (!str.contains("'")) {
    str= "'" + str + "'";
} else {
    str= '"' + str.replaceAll("\"", "\"+'\"'+\"").replaceAll("\\+\"\"|\"\"\\+", "") + '"';
}
房子昂
2023-03-14

>

  • 对于标签,请使用反引号 ('),如标签名称上的文档所述。

    您可以将属性打包到 Java 映射中,并将其作为参数传递。如果您使用的是 Java 驱动程序,下面介绍了如何传递参数。

    请注意,参数语法在版本 3.2 中已更改 - 参数文档页面提供了有关该内容的详细信息。

  •  类似资料:
    • 问题内容: 我一直在尝试找出如何使用MySQL进行查询的方法,该查询检查特定列中的值(字符串)是否包含某些数据(字符串),如下所示: 在PHP中,该函数称为,因此可能: 问题答案: 实际上很简单: 的是用于设置任何字符(无,一个或多个)的通配符。请注意,这在非常大的数据集上可能会变慢,因此,如果数据库增长,则需要使用全文索引。

    • 我试图在Flatter Firebase中执行一个“where”查询,以按名称进行过滤(如果对象名为“Una casa roja”,用户写“casa”,则必须返回该对象)。我不知道我能问谁。我只有这个,但不是我想要的: 谢谢

    • 我的Firebase查询有点麻烦。我想查询objects,其中objects子值包含某个字符串。到目前为止,我有一些东西看起来是这样的: 但这只给出起始值为“b”的对象。我想要包含字符串“b”的对象。我该怎么做?

    • 问题内容: 我正在使用SQLAlchemy和SQLite3构建查询,其中我想选择其中String列包含特定子字符串的行。做到这一点的最佳方法是什么? 问题答案: 筛选。还有一个不区分大小写的搜索。 对于更高级的界面,您可以允许使用已知的“ dir”通配符。 笔记: 和是(如果数据库是由另一个应用程序创建的,则SQLSoup很有用) 对于SQLAlchemy Core是。当您需要原始SQL的所有功能

    • 问题内容: 考虑到与类似值的字符串列,什么是查询所有的最佳方法 ,其中包括给定数量的记录 (例如)? 我脑海中的解决方案是: 但由于前导,因此AFAIK该查询无法在列上使用索引。 必须有更好的东西。它是什么? 使用PostgreSQL,但 更希望 该解决方案也适用于其他DB。 问题答案: 在PostgreSQL 9.1中,您可以利用该模块并用它构建一个GIN索引。 您的表达式即使没有左锚也可以使用

    • 我知道拆分字符串并使用运算符是可能的,但我想知道是否可以使用字符串比较轻松地完成。