我正在尝试将顶点的所有属性放在地图中并向该地图添加其他值。稍后,我想将此地图作为 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。