2017-01-14 4 views
0

文字列パラメータをJavaのCypherクエリに挿入したいとします。以下は私が使用したコードで、私は 'piyumi'という名前の人のノードを持っていて、アクティビティノードとの関係を作りたいと思っています。アクティビティノードの名前は「ウォーキング」です。コードを実行すると、httpのステータスコード400が得られます。誰も私がエラーなしで文字列変数を挿入できるように、サイファークエリを変更する手助けがあります。JavaコードのCypherクエリに文字列パラメータを挿入する際にエラーが発生しました

import com.sun.jersey.api.client.Client; 
import com.sun.jersey.api.client.ClientResponse; 
import com.sun.jersey.api.client.WebResource; 
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter; 
import org.codehaus.jettison.json.JSONException; 
import org.codehaus.jettison.json.JSONObject; 

import javax.ws.rs.core.MediaType; 

public class NeoAPIClass { 
    private final String baseUri = "http://localhost:7474/db/data/cypher"; 
    private final String user = "neo4j"; 
    private final String password = "12345"; 

    public static void main(String args[]) throws JSONException { 
      NeoAPIClass n=new NeoAPIClass(); 
      n.runQuery(); 
    } 

    void runQuery() throws JSONException { 
     Client client = Client.create(); 
     client.addFilter(new HTTPBasicAuthFilter(user, password)); 
     WebResource cypherResource = client.resource(baseUri); 


     String s="walking"; 
     JSONObject obj = new JSONObject(); 
     obj.put("query", "Match(piyumi : Person{name:\"Piyumi\"}) create (piyumi)-[:doing{timestamp:4789}]->(n:activity) WHERE n.name=s"); 
     String st = obj.toString(); 

     ClientResponse cypherResponse = cypherResource.accept(MediaType.APPLICATION_JSON) 
       .type(MediaType.APPLICATION_JSON_TYPE).entity(st).post(ClientResponse.class); 

     System.out.println("Output from Server .... "+ cypherResponse.getStatus()); 


    } 

} 

答えて

2

に見える結合することは不可能ですcreateおよびwhere。最初に一致する人物とアクティビティが必要です。次に関係を作成します。

は、さらに要求(https://neo4j.com/docs/rest-docs/current/#rest-api-use-parameters)の別の部分に転送パラメータを簡素化することをお勧めします:

JSONObject request = new JSONObject(); 
JSONObject params = new JSONObject(); 

String query = "MATCH (P:Person { name:{personName} }) \n"; 
query = query + "MATCH (A:activity { name:{activityName} }) \n"; 
query = query + "CREATE (P)-[rel:doing { timestamp:{activityTimestamp} }]->(A) \n"; 
query = query + "RETURN P, A, rel"; 

request.put("query", query); 

params.put("personName", "Piyumi"); 
params.put("activityName", "walking"); 
params.put("activityTimestamp", 4789); 

request.put("params", params); 

ClientResponse cypherResponse = cypherResource.accept(MediaType.APPLICATION_JSON) 
      .type(MediaType.APPLICATION_JSON_TYPE) 
      .entity(request.toString()) 
      .post(ClientResponse.class); 

System.out.println("Response: " + cypherResponse.getEntity(String.class)); 
+0

ありがとうございました。 –

1

あなたの問題は、CYPHERサーバーがJavaコードから変数sを見ることができないということです。 Java変数の名前ではなく、Stringを持つサイファークエリを渡す必要があります。

obj.putで行をこれに変更することができます。

obj.put("query", "Match(piyumi : Person{name:\"Piyumi\"}) create (piyumi)-[:doing{timestamp:4789}]->(n:activity) WHERE n.name=\"" + s + "\""); 
+0

おかげで迅速な対応のために多くのことを。 obj.out行をあなたが与えた行に置き換えました。しかし、私はまだ同じエラーが発生します。この問題で私をさらに助けてくれますか? –

+0

このエラーは、サイファーサーバーが提供したクエリを理解できないことを示しています。私はサイファークエリ言語に特に精通していないので、なぜわからないのですか。サイファーサーバーは、より有用なエラーを含むログを生成しますか? –

+0

エラーなし400ログがありません。 –

0

既存のノードを取得しようとすると問題が発生します。 だから、http://localhost:7474/browser/に移動して、クエリの下に実行

MATCH(N:活動)= CREATE "歩く" n.name を(piyumi:人{名: "Piyumiを"}) - [R1:{やっタイムスタンプ:4789}] - >(n)

正常に機能する場合は、それを取得します。 MATCH(piyumi:人) - [R1:やっ] - >(N:活動) RETURN R1

だからあなたのクエリコードすべきであるが、このよう

"MATCH (n:activity)\nWHERE n.name=\"walking\"\nCREATE (piyumi:Person{name:\"Piyumi\"}) - [r1:doing{timestamp:4789}]-> (n)"

+0

迅速な対応に感謝します。しかし、そこには\ "walking \"という変数名が必要です。これで私を助けてくれますか?私はそこにsを入れたいです。 –

+0

これが正しい場合は、MATCH(n:activity)\ nWHERE n.name = \ "" + s + "\" \ nCREATE(piyumi:Person {name:\ "Piyumi \ "}) - [R1:4789}:{タイムスタンプ実行] - >(n)が" ' –

+0

変数 "S" を加えた、 ' obj.put( "クエリ"、 \t \t \t \t「MATCH(N:活性)\ nここにn。名前= \ "" + S \t \t \t \t \t \t + "\"(:{:Piyumi \ "\ nCREATE piyumi人物名\"}) - [R1:やっ{タイムスタンプ:4789}] - >(N) ");' これは動作し、httpステータス200を与えます。 – lahirumw

関連する問題