0

早上好,我建立了一个本地 Neo4j 数据库,并想对 maven 依赖关系图进行建模。当我通过 webconsole 执行以下语句时,一切正常:

start root = node(1)
create unique root -[:ROOT]-> (n{groupId:'fancyStuff',artifactId:'somewhat', version:'1.4'})
return n

(注意:rootnode 用于调试目的,稍后将替换为实际结构)因此,这里一切正常,无论我使用多少空格或将 ' 替换为 "

在我的 java 应用程序中,我具有以下功能:

private static URI getOrCreate(Artifact artifact){
        String cypherUri = SERVER_ROOT_URI + "cypher";

        String cypherStatement="{\"query\" : \"start x  = node(1) " +
                "create unique x -[:ROOT]-> (artifact{groupId:\"" + artifact.getGroupID() +
                "\", artifactId:\"" + artifact.getArtifactID() +
                "\", version: \"" + artifact.getVersion() +
                "\"}) return artifact ,\"params\" : {}}";

        WebResource resource = Client.create()
                .resource( cypherUri );
        ClientResponse response = resource.accept( MediaType.APPLICATION_JSON_TYPE )
                .type( MediaType.APPLICATION_JSON_TYPE )
                .entity( cypherStatement )
                .post( ClientResponse.class );

        System.out.println( String.format( "POST to [%s], status code [%d]",
                cypherUri, response.getStatus() ) );

        response.close();
        return response.getLocation();
    }

所以基本上我发布了一个看起来像的 json 文件

{"query" : "start root = node(1) create unique root-[:ROOT]->(artifact{groupId:'{"query" : "start root = node(1) create unique root-[:ROOT]->(artifact{groupId:'lol',artifactId:'somewhat',version:'1.4'}) return artifact","params" : {}}

同样,无论我使用什么空格或“/”,我都会收到 http 500 错误,表示关系的第一个 - [:ROOT]-> 无效。

直接通过发布新节点

final String nodeEntryPointUri = SERVER_ROOT_URI + "node";
WebResource resource = Client.create().resource( nodeEntryPointUri );
ClientResponse response = resource.accept( MediaType.APPLICATION_JSON_TYPE )
         .type( MediaType.APPLICATION_JSON_TYPE )
         .entity( /*some json*/)
         .post(ClientResponse.class);

(免责声明:我会尽快将参数移动到正确的位置这个版本工作;))

我可以打赌这是一个完全微不足道的错误,但我现在盯着这个超过半个工作日,我的任何变化都不想工作。如果有人知道答案,那就太棒了。

问候,弗洛里安·罗姆

4

2 回答 2

0

好的,我不知道这个语句有什么不同,但这有效(我也尝试了上面代码中的参数拆分):

String cypherUri = SERVER_ROOT_URI + "cypher";        
JSONObject jObject = new JSONObject();
        try {
            Map<String, String> params = new HashMap<String, String>();
            params.put("groupId", artifact.getGroupID());
            params.put("artifactId", artifact.getArtifactID());
            params.put("version", artifact.getVersion());
            String query = "start x  = node(1) create unique x-[:ROOT]->(n{groupId:{groupId},artifactId:{artifactId},version:{version} }) return n";
            jObject.put("query", query);
            jObject.put("params", params);
        } catch (Exception e) {
            e.printStackTrace();
        }

        WebResource resource = Client.create()
                .resource( cypherUri );
        ClientResponse response = resource.accept( MediaType.APPLICATION_JSON_TYPE )
                .type(MediaType.APPLICATION_JSON_TYPE)
                .entity(jObject.toString())
                .post(ClientResponse.class);

但无论如何,第二次尝试更好,我不会抱怨 :D 它只是让我不知道那里发生了什么......

于 2013-03-21T08:04:03.423 回答
0

问题是您的 JSON 无效。你重复query两次。如果删除星星之间的部分,它会起作用吗?

**{"query" : 
    "start root = node(1) 
    create unique root-[:ROOT]->(artifact{groupId:'**
{"query" : "start root = node(1) 
  create unique root-[:ROOT]->(artifact{groupId:'lol',artifactId:'somewhat',version:'1.4'}) 
  return artifact",
 "params" : {}
}
于 2013-03-20T11:23:08.687 回答