0

我正在尝试将顶点的所有属性放在地图中并向该地图添加其他值。稍后,我想将此地图作为 JSON 响应返回。一般来说,我发现 neo4j 的REST-API有点冗长,我需要一个顶点的 ID 以及其他值。因此,我决定直接通过 gremlin 查询来执行此操作。

结果应如下所示:

[ {"id": 1, "name": "Name1"}, {"id": 2, "name": "Name2"} ]

我设法使用以下 gremlin 脚本做到了这一点:

x = [];
g.v( 1 ).out.transform{
                     m = [:];
                     m.putAll( it.map() );
                     m.put( "id", it.id );
                     x.add( m )
                    }.iterate();
x

但是,我在 neo4j 社区 1.8.2 和 1.9M05 中遇到了这个查询的问题。

a) neo4j 1.8.2 返回字符串的 JSONArray 而不是 JSONObjects 的 JSONArray:

[ "{id: 1, name: Name1}", "{id: 2, name: Name2}" ]

b) neo4j 1.9M5 返回异常:

{
  "message":"Invalid list type: map",
  "exception":"IllegalStateException",
  "stacktrace":
      [
        "org.neo4j.server.rest.repr.RepresentationFormat.serializeList(RepresentationFormat.java:65)",
        "org.neo4j.server.rest.repr.ListRepresentation.serialize(ListRepresentation.java:50)",
        "org.neo4j.server.rest.repr.OutputFormat.assemble(OutputFormat.java:179)",
        "org.neo4j.server.rest.repr.OutputFormat.formatRepresentation(OutputFormat.java:131)",
        "org.neo4j.server.rest.repr.OutputFormat.response(OutputFormat.java:117)",
        "org.neo4j.server.rest.repr.OutputFormat.ok(OutputFormat.java:55)",
        "org.neo4j.server.rest.web.ExtensionService.invokeGraphDatabaseExtension(ExtensionService.java:122)",
        "java.lang.reflect.Method.invoke(Method.java:597)"
      ]
}

如果我修改 gremlin 脚本并将 x 更改为地图,它可以在两个 neo4j 版本中使用:

x = [:];
g.v( 1 ).out.transform{
                     m = [:];
                     m.putAll( it.map() );
                     m.put( "id", it.id );
                     x.put(it.id, m );
                    }.iterate();
x

返回

{ "1" : {"id": 1, "name": "Name1"}, "2" : {"id": 2, "name": "Name2"} }

然而,结果现在是一个带有 JSONObjects 的 JSONObject。

有没有办法使用 gremlin 解决我的问题?我前两天刚开始学习gremlin。

4

1 回答 1

0

由于neo4j,这两种情况都不起作用。1.8.2 版在自定义地图方面的 JSONSerialization 很差。已提供 1.9 版的修复程序。

于 2013-04-18T14:27:19.030 回答