Neo4j通过休息执行密码查询

时间:2013-03-20 09:29:12

标签: java rest neo4j cypher

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

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

(注意:rootnode用于调试目的,稍后将被实际结构替换) 所以,这里一切正常,无论我采取多少空格或替换'with“

在我的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" : {}}

无论是什么whitespacing或“/”我使用我得到一个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);

(免责声明:尽管这个版本有效,我会把参数移到正确的位置;)

我可以打赌这是一些非常微不足道的错误,但我现在正在盯着这个工作日超过半个工作日而且我的变化都不想工作。 如果有人知道答案,那会很棒。

问候, Florian Rohm

2 个答案:

答案 0 :(得分: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" : {}
}

答案 1 :(得分:0)

好的,我不知道这个陈述有什么不同但是这个有效(我在上面的代码中尝试过param):

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 这只是让我不知道那里发生了什么......