2016-06-14 4 views
0

に失敗:のNeo4j OGM Neo4jSession変数置換クエリは、私にとって

neo4jSession.query("MATCH (n:Widget) WHERE (n.partNumber STARTS WITH '001') RETURN n.partNumber AS id, n.name AS description, n.urn AS urn LIMIT 10", Collections.emptyMap()); 

作品を。

このクエリでは動作しません:

String query = "MATCH (n:Widget) " + 
    "WHERE (n.partNumber STARTS WITH {queryString}) " + 
    "RETURN n.partNumber AS id, n.name AS description, n.urn AS urn " + 
    "LIMIT {limit}"; 
Map<String, Object> params = ImmutableMap 
    .<String, Object>builder() 
    .put("queryString", queryString) 
    .put("limit", limit) 
    .build(); 
return (List) neo4jOperations.queryForObjects(Object.class, query, params); 

それは空のリストを返します。私も実際のドメインオブジェクトで試してみました:

return (List) neo4jOperations.queryForObjects(Widget.class, query, params); 

同じ結果です。

私はOGM 2.0.2、neo4j 2.3.2、Spring Data Neo4j 4.1.1を使用していますが、Neo4jSessionを単独で使用しても同じ結果を得てneo4jOperationsなしでこれを試しました。ああ、私はHTTPドライバでneo4jのインスタンスを削除しています。

OGMにバグはありますか?

MORE INFO:ワイヤ上

、私は、メッセージは次のようになりBELIEVE:

{  "statements":[ 
     { 
     "statement":"MATCH (n:Widget) WHERE (n.partNumber STARTS WITH {queryString}) RETURN n.partNumber AS id, n.name AS description, n.urn AS urn LIMIT {limit}", 
     "parameters":{ 
      "queryString":"001", 
      "limit":10 
     }, 
     "resultDataContents":[ 
      "graph" 
     ], 
     "includeStats":false 
     } ] } 




{  "statements":[ 
     { 
     "statement":"MATCH (n:Widget) WHERE (n.partNumber STARTS WITH '001') RETURN n.partNumber AS id, n.name AS description, n.urn AS urn LIMIT 10", 
     "parameters":{ 

     }, 
     "resultDataContents":[ 
      "rest" 
     ], 
     "includeStats":true 
     } ] } 

さらに多くの情報:私は両方@QueryResultとしてウィジェットでこれを試してみた

と@NodeEntity(ゲッターとセッター付き)。

@QueryResult 
public class TypeaheadData { 
    public Object id; 
    public String description; 
    public String uid; 
} 

@NodeEntity 
public class TypeaheadData { 
    public Object id; 
    public String description; 
    public String uid; 

    public TypeaheadData() { 
    } 

    public Object getId() { 
    return id; 
    } 

    public void setId(Object id) { 
    this.id = id; 
    } 

    public String getDescription() { 
    return description; 
    } 

    public void setDescription(String description) { 
    this.description = description; 
    } 

    public String getUid() { 
    return uid; 
    } 

    public void setUid(String uid) { 
    this.uid = uid; 
    } 
} 

は、私はまた、ワイヤ上の応答を検査してきたし、両方のケースで、それは次のようになります。

{ 
    "results":[ 
     { 
     "columns":[ 
      "id", 
      "description", 
      "uid" 
     ], 
     "data":[ 
      { 
       "graph":{ 
        "nodes":[ 

        ], 
        "relationships":[ 

        ] 
       } 
      }, 
      { 
       "graph":{ 
        "nodes":[ 

        ], 
        "relationships":[ 

        ] 
       } 
      }, 
      { 
       "graph":{ 
        "nodes":[ 

        ], 
        "relationships":[ 

        ] 
       } 
      }, 
      { 
       "graph":{ 
        "nodes":[ 

        ], 
        "relationships":[ 

        ] 
       } 
      }, 
      { 
       "graph":{ 
        "nodes":[ 

        ], 
        "relationships":[ 

        ] 
       } 
      }, 
      { 
       "graph":{ 
        "nodes":[ 

        ], 
        "relationships":[ 

        ] 
       } 
      }, 
      { 
       "graph":{ 
        "nodes":[ 

        ], 
        "relationships":[ 

        ] 
       } 
      }, 
      { 
       "graph":{ 
        "nodes":[ 

        ], 
        "relationships":[ 

        ] 
       } 
      }, 
      { 
       "graph":{ 
        "nodes":[ 

        ], 
        "relationships":[ 

        ] 
       } 
      }, 
      { 
       "graph":{ 
        "nodes":[ 

        ], 
        "relationships":[ 

        ] 
       } 
      } 
     ] 
     } 
    ], 
    "errors":[ 

    ] 
} 

私はウィジェット@NodeEntity、これを削除した場合要求が送信された:

{ 
    "statements":[ 
     { 
     "statement":"MATCH (n:Widget) WHERE (n.partNumber STARTS WITH {queryString}) RETURN n.partNumber AS id, n.name AS description, n.urn AS urn LIMIT {limit}", 
     "parameters":{ 
      "queryString":"001", 
      "limit":10 
     }, 
     "resultDataContents":[ 
      "row" 
     ], 
     "includeStats":false 
     } 
    ] 
} 

ウィジェット@NodeEntityを除去したが、応答はそれで正しいデータを持っているが、マッパーはスロー:

スカラ応答クエリは、1つの列のみを返す必要があります。 サイファークエリで1つのアイテムのみが返されるようにしてください。

答えて

2

OGMは、プロパティのコレクションをドメインエンティティにマップできません。

RETURN n.partNumber AS id, n.name AS description, n.urn AS urn 

を、それがすべてで1であれば、これは、あるエンティティの種類OGMを伝えるためには何もありません: あなたのクエリが返されます。ノード全体のオブジェクトを返しませんマッピングクエリを処理することはできませんneo4jOperations.queryForObjects(Widget.class, query, params);

+0

queryForObjectは、ランダムノードプロパティで使用する必要があるメソッドではありません。あなたが報告した問題についてもhttps://github.com/neo4j/neo4j-ogm/issues/184にコメントしました – Luanne

1

のNeo4j OGMで仕事をする必要がありますRETURN nにこれを変更する

。クエリでノードのプロパティのサブセットのみを要求する場合は、結果を返すqueryメソッドを使用する必要があります。そして、自分で地図を作成する必要があります。

spring-data-neo4jを使用している場合、@QueryResultアノテーションをリポジトリ@Queryと組み合わせて使用​​して、マッピングを処理できます。コードを見てみると、Neo4jSessionが提供するメタデータからマッパを見つけたのです。

ただし、ノードで単一のプロパティを照会する場合は、queryForObjects関数が機能します。

私の見落としのようですが、誰が私に言いたいのですか?

関連する問題