1

在 Java 项目中使用 Redis Labs 的 RedishGraph。当我将地图属性作为输入传递给 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

4

1 回答 1

2

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

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

第二,你能分享一下你使用的是哪个版本的 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:valueJRedisGraph 中映射对象的序列化格式错误导致的错误,该对象当前调用将toString()其序列化的 map 方法,key = value因此我们的解析器跳过参数解析并将映射视为一部分的实际查询。

通过MONITOR在 redis-cli 中应用,您的查询会产生以下命令: "graph.QUERY" "UserGraph" "CYPHER props={name=Jagadeesh, id=2, age=23} CREATE ($props)" "--COMPACT" 如您所见,地图是以key=value格式发送的。我手动更改了查询并将其发送到 redis-clikey:value格式并得到了预期的响应:

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.
于 2020-06-10T08:32:11.187 回答