2016-04-01 21 views
0

私は、ユーザーが投稿を持つことができ、また投稿を持っている友人を持つことができるというグラフを持っています。
ユーザーと彼がフォローしている友人のすべての投稿をどのようにクエリできますか?
私はこの試みた:Java Neo4j Cypher Or Match

" MATCH (u1:User)-[:POSTED]->(p1:Post)" 
+ " WHERE u1.username =~ '"+user+"'" 
+ " OPTIONAL MATCH (u3:User)-[:FOLLOWING]->(u2:User)-[:POSTED]->(p2:Post)," 
+ " (u3:User)-[:FRIEND_OF]->(u2:User)" 
+ " WHERE u3.username =~ '"+user+"' return u1.username, u1.name," 
         + "p1 ,u2.username, u2.name , p2"; 

をしかし、このクエリは、重複を返す私たちは、ユーザとの友人を持って言うことができます。
frienには1つの投稿があり、ユーザーには2つのクエリが返されます。のMATCHのようにクエリは友人の投稿を2回返します。の結果も返します。さらにexaplainへ

:(:ポスト)重複せず、好ましくは単一のクエリとそれらの関係を満たす

(u:User)-[:POSTED]->(p:Post) 
(u:User)-[:FRIEND_OF]->(u2:User) 
(u:User)-[:FOLLOWING]->(u2:User)-[:POSTED]->(p2:Post) 

が、これらは私がしたいことは、すべての投稿で存在する関係です。

+0

なぜ落札ですか? –

答えて

0

まず、クエリははるかに複雑である必要があります。この簡単なクエリは同等でなければなりません。 {user}parameterとして提供されているとします。

MATCH (u1:User {username: {user}})-[:POSTED]->(p1:Post) 
OPTIONAL MATCH 
    (u1)-[:FOLLOWING]->(u2:User)-[:POSTED]->(p2:Post), 
    (u1)-[:FRIEND_OF]->(u2) 
RETURN u1.username, u1.name, p1, u2.username, u2.name, p2; 

あなたRETURN句がu1と一緒にu2に関連した値を返しているので、あなたが同じp2値を持つ複数の行を取得する理由があります。 N u1/p1の結果とM u2/p2の結果がある場合、N*Mの結果行が表示されます。 (u1/p2結果ごとに1行で)N行で結果を得るために

、このクエリのようなものを使用することができます

MATCH (u1:User {username: {user}})-[:POSTED]->(p1:Post) 
OPTIONAL MATCH 
    (u1)-[:FOLLOWING]->(u2:User)-[:POSTED]->(p2:Post), 
    (u1)-[:FRIEND_OF]->(u2) 
RETURN 
    u1.username, u1.name, p1, 
    COLLECT({username: u2.username, name: u2.name, p2: p2}) AS friends; 

を各結果行は、各関連友人のためにデータをfriendsコレクションを持っています。

+0

答えがありがとう、しかし私はコレクションを反復することはできません私はhttp://stackoverflow.com/questions/31554217/issue-of-casting-node-neo4jの解決策を試みたが、私はまだエラーscalaを取得.collection.convert.Wrappers $ MapWrapperはorg.neo4j.graphdb.Nodeにキャストできません –

+0

SOの質問はコレクションには適していません。単なるノードを含む列を反復しようとしてはいけません。結果を反復することができないというのは、実際には別の問題です。新しい質問を作成する必要があります。 – cybersam

+0

私はそれらを使って繰り返し処理しました:[コード] \t \t scala.collection.convert.Wrappers.IteratorWrapper it =((SeqWrapper)row.get( "friends"))。iterator(); \t \t一方(it.hasNext()){ \t \t \t MapWrapper M =(MapWrapper)it.next(); \t \t \tノードn =(ノード)m.get( "p2"); \t \t \t(キー文字列:n.getPropertyKeys())のために{ \t \t \t \t \t \t \t \tのSystem.out.println( "キー:" +キー+ "値:" + N。getProperty(key)); \t \t \t \t \t} [java] Javaインストールごとにscala.collection.convert.Wrappersパッケージが含まれていますか? –