免责声明:我是 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:value
JRedisGraph 中映射对象的序列化格式错误导致的错误,该对象当前调用将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.