Java客户端密码查询与RedisGraph redis.clients.jedis.exceptions.JedisDataException : errMsg: Invalid input 'p' : expected PROFILE line: 1

标签 java redis cypher redisgraph

在 Java 项目中使用 Redis Labs 的 RedishGraph。当我将 map 属性作为输入传递给 Cypher 查询时出现以下错误。

 ObjectMapper oMapper = new ObjectMapper();
 Person person=new Person(2, "Jagadeesh", 23);
 Map<String, Object> personMap = oMapper.convertValue(person, Map.class);

 Map<String, Object> props=new HashMap<>();
 props.put("props", personMap);

 ResultSet rs1 = graph.query("UserGraph", "CREATE ($props)", props);

出现意外错误(类型=内部服务器错误,状态=500)。
redis.clients.jedis.exceptions.JedisDataException:errMsg:无效输入“p”:预期的 PROFILE 行:1,列:4,偏移量:3 errCtx:props={id=2,name=Jagadeesh,age=23} CREATE( $props) errCtxOffset: 3

最佳答案

免责声明:我是 RedisGraph 的工程师之一。

首先,我们暂时不支持将 map 作为 RedisGraph 中的 native 数据类型,因此很遗憾,目前不支持您的查询。

第二,你能分享一下你使用的是哪个版本的 RedisGraph 吗?我在我们最新的 docker 镜像 (docker run -p 6379:6379 --rm redislabs/redisgraph:latest) 上执行了以下代码

    @Test
    public void testStackOverflowQuestion(){
        RedisGraph graph = new RedisGraph();
        Map<String, Object> props = new HashMap<>();
        props.put("id", 2);
        props.put("name", "Jagadeesh");
        props.put("age", 23);
        graph.query("UserGraph", "CREATE ($props)", props);
    }

并且响应似乎更适合未支持的数据类型:
com.redislabs.redisgraph.exceptions.JRedisGraphCompileTimeException: redis.clients.jedis.exceptions.JedisDataException: Encountered unhandled type in inlined properties.

评论后编辑:

我将测试修改为

    @Test
    public void testStackOverflowQuestion(){
        RedisGraph graph = new RedisGraph();
        Map<String, Object> personMap = new HashMap<>();
        personMap.put("id", 2);
        personMap.put("name", "Jagadeesh");
        personMap.put("age", 23);
        Map<String, Object> props = new HashMap<>();
        props.put("props", personMap);
        graph.query("UserGraph", "CREATE ($props)", props);
    }

我得到了和你一样的回应。
这是我们的解析器错误。我们的解析器期望映射键值对用冒号分隔 key:value当前调用map的JRedisGraph中map对象的序列化格式错误导致的错误toString()将其序列化为 key = value 的方法所以我们的解析器跳过参数解析并将 map 视为实际查询的一部分。

通过申请 MONITOR在 redis-cli 中,您的查询会产生以下命令:"graph.QUERY" "UserGraph" "CYPHER props={name=Jagadeesh, id=2, age=23} CREATE ($props)" "--COMPACT"如您所见, map 发送到key=value格式。
我手动更改了查询并使用 key:value 在 redis-cli 中发送它格式并得到预期的响应:
127.0.0.1:6379> graph.query g "CYPHER props={name:Jagadeesh, id:2, age:23} CREATE ($props)"
(error) Encountered unhandled type in inlined properties.

关于Java客户端密码查询与RedisGraph redis.clients.jedis.exceptions.JedisDataException : errMsg: Invalid input 'p' : expected PROFILE line: 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62186539/

相关文章:

java - 如何重新初始化一个Spring Bean?

amazon-web-services - 位于不同区域的 EC2 实例之间的数据实时复制

angularjs - 使用 Laravel 作为 API 时每个用户创建的大量 session

java - spring data neo4j 4.2.0.RELEASE自定义查询问题

Neo4j 如何从某个起始节点递归删除节点

java - 使用 `String` 时,如何告诉 SuperCSV 映射空的 `CsvDozerBeanWriter` 属性?

Java Hibernate暂时忽略带有条件的@ManyToOne注释

redis-cli 删除键模式不删除记录

datetime - Neo4j 在不使用 apoc 插件的情况下将 timestamp() 纪元格式化为日期时间

java - 查找数组中的模数