2017-04-19 10 views
0

私のグラフモデルは、同じタイプの他のノードと親子関係を持つタイプAのノードを含んでいます。私はCYPHER文が Neo4j OGM型付きクエリで関連するオブジェクトをフィルタリングするにはどうすればよいですか?

MATCH (node:A) WHERE ... OPTIONAL MATCH ... RETURN node, ... ORDER BY node.id ASC LIMIT 100 

のようなものが今ここで

session.query(A.class, cypher, parameters) 

(ページング、フィルタリング、オプションの試合などのために)複雑なクエリを実行するには、次のセッションメソッドを使用してい

@NodeEntity(label = "A") 
class A { 
    @Relationship(type = "PARENT") 
    private A parent; 

    // other relations to different types 
    ... 

} 

私はまた、各結果(タイプAでもあります)の親ノードを取得したいと考えています。このために、私は単純に見ると期待何

MATCH (node:A) WHERE ... OPTIONAL MATCH parentRels=(node)-[parentRel:PARENT*1..]->(:A) RETURN node, collect(parentRel) ORDER BY node.id ASC LIMIT 100 

と私のクエリを拡張し、各親フィールドがうまくルートまで、満たされているオブジェクトの私の同じリストAは、です。 Neo4jによって返された結果は正しいですが、OGMによって返されたマップ結果は役に立たなくなりました。なぜなら、関心のあるノード(親フィールドが正しく入力されている、はい)が含まれているだけでなく、結果リストに!

私は関心のあるノードで結果の列(上記の例では「ノード」)を指定できる隠しOGM機能を探し始めましたが、これは可能ではないようです。私が見

唯一の解決策は以下のとおりです。

  • は別々のクエリで親ノードをフェッチ:(
  • は自分自身をマッピングん:(:(
  • ベースの別のクエリやフィルタで関連のIDを取得しますその上で。

はたぶん誰かがよりよい解決策を見ている?

答えて

0

その理由は、あなたの両親がqueryメソッドで渡したタイプ(A.class)と一致することを確認してください。

OGMは、実際に求められていた結果が何であるかを知る方法がなく、一致するすべてのノードを結果にマップします.1つの行で2つ以上の結果が結果リストに表示されることがあります。 (一部の人々は逆のユースケースを持ち、実際にそれが起こることを望んでいることに注意してください)。

また、あなたはそれが正しくマッピングされるすべての関係と関連するノードを返して、手動で結果列の結果を収集することができます。

別にあなたがすることもでき

  • をあなたに記載されているものとは
    Result result = session.query(cypher, parameters) 
    for(Map<String, Object> map : result.queryResults()) { 
        (A) map.get("node"); // collect result manually to some collection 
    } 
    

    親に別のタイプ/ラベルを提供する

  • 親があなたのセッションにロードされ、パス全体ではなくノードと関係のみが返されるようにしてください。RETURN node,parentRelの代わりに

この問題を解決するには、https://github.com/neo4j/neo4j-ogm/issuesの問題をここで記入してください。

+0

あなたのご回答にはThx。異なるラベルを使用することは、実際には同じノードタイプについて話しているので、オプションではありません。あなたの2番目のオプションについては、私は関係を返すだけで、私はノードafaikをナビゲートすることができなくなります。このような孤立したユースケースには見えないので、私は問題を記入します... – Christian

+0

https://github.com/neo4j/neo4j-ogm/issues/351 – Christian

+0

@Christianちょうど別の方法があると思います編集された答え –

関連する問題