2016-10-17 10 views
0

まず、私がNeo4jの新機能であることを指摘してください。もっと良い方法があれば教えてください。Neo4j - ノードとの完全な関係

第二に、どのように私はまた、見つけることができます。

// QUERY 
if(!empty($_SESSION['uid'])) { 
    $uid = $_SESSION['uid']; 
    $query = 'MATCH (cu:User) 
    WHERE cu.id = "'.$uid.'" 
    WITH cu 
    MATCH (p:Painting)<-[:PAINTED]-(u:User)-[:LIVES_IN]->(l:Location) 
    WHERE (p.slug) = "'.$slug.'" 
     RETURN p,u,l, 
     EXISTS((cu)-[:LIKES]->(p)) as liked, 
     EXISTS((cu)-[:FOLLOWS]->(u)) as followed, 
     SIZE((:User)-[:LIKES]->(p)) as total_likes, 
     SIZE((:User)-[:FOLLOWS]->(u)) as total_follows 
    LIMIT 1';  
} else { 
    $query = 'MATCH (p:Painting)<-[:PAINTED]-(u:User)-[:LIVES_IN]->(l:Location) WHERE (p.slug) = "'.$slug.'" 
     RETURN p,u,l, 
     SIZE((:User)-[:LIKES]->(p)) as total_likes, 
     SIZE((:User)-[:FOLLOWS]->(u)) as total_follows 
     LIMIT 1'; 
} 

は、だから今私は、ユーザーの可用性に応じて2つのクエリを実行していますよ。私はこれを行うためのより良い/より効率的な方法がなければならないと想像しなければならないが、少なくとも現時点では機能する。

+0

Total_LikesとTotal_Followsをどのようにすべきかを明確にすることはできますか?私たちはすでに絵画の好きな人数と、その人に従う人数を返しています。この特定のユーザーが好きな絵の数と、この特定のユーザーが従う他の人の数を取得しようとしていますか?それとももっと何か? – InverseFalcon

+0

total_likes =絵の総数(p) total_follows =アーティストの合計()0/1現在のユーザーがpを好きかどうかを確認してください(0 /いいえ1) 0/1現在の状態を確認してくださいユーザーはこれに従っています(0 /いいえ1) – Grant

+0

この "現在のユーザー"のために、彼らは絵を気に入ってペインターに従ったかどうかを知りたいのですか?現在のユーザーをどのように見つけますか(IDで名前で?)この「現在のユーザー」を説明のクエリに追加できますか? – InverseFalcon

答えて

0

現在のユーザーのコンセプトがあるようですが、おそらくIDや名前などで取得し、その絵が気に入っているかどうかを確認して、その "

私はこの1つでスタブを作って、好き嫌いの数をより良く得る方法をいくつか改良します。

MATCH (currentUser:User) 
WHERE currentUser.ID = 123 
WITH currentUser 
MATCH (p:Painting)<-[:PAINTED]-(painter:User)-[:LIVES_IN]->(l:Location) 
WHERE (p.slug) = "blah-blah-blah" 
    RETURN p,painter,l, 
    SIZE((:User)-[:LIKES]->(p)) as painting_likes, 
    SIZE((:User)-[:FOLLOWS]->(painter)) as painter_follows, 
    EXISTS((currentUser)-[:LIKES]->(p)) as current_user_liked, 
    EXISTS((currentUser)-[:FOLLOWS]->(painter)) as current_user_followed 
LIMIT 1 
+0

私は上記の質問を更新しました。私はあなたのコードを通過します。 – Grant

+0

currentUser.IDが空の場合の処理​​方法がわかりませんが、動作するようです。まだ塗装、ユーザー、および場所を返す必要があります。私は一致が存在しない場合、なぜEXISTSが0を返さないのか分かりません。 – Grant

+0

すべてのユーザーがある種のIDを持っているとは限りませんか?これはほんの一例であったので、あなたの固有の、存在する制約によって使用されていた、通常はユーザーが使用するプロパティを使用してください。neo4jのブール値は、ブール値を返します.Oracleや他のDBと同様0/1ではありません。パターンが存在しない場合はfalseを返します。 – InverseFalcon

0
MATCH (p:Painting)<-[:PAINTED]-(u:User)-[:LIVES_IN]->(l:Location) WHERE (p.slug) = "blah-blah-blah" 
WITH p, u, l 
OPTIONAL MATCH (ul:User)-[likes:LIKES]->(p) 
OPTIONAL MATCH (uf:User)-[follows:FOLLOWS]->(u) 
RETURN p,u,l,ul,uf LIMIT 1 

これは正しいグラフを返します。私は、なぜlike/follow接続を確認するのに苦労しているのかわかりません。

私は今日、多くのことを試みましたが、私はもう何が上下しているのか分かりません。私はオプションのマッチを実際には合計値を扱うようになったと思います。私が問題を抱えているのは、既存のユーザーが好きだったかどうかを確認することだと思います。

+0

一般的に、問題の説明を編集して追加情報を追加し、回答を予約することをお勧めします – InverseFalcon

+0

私はそれを紛失しているはずです。私はどこでも編集ボタンを探しました... – Grant

+0

これは、あなたの説明の下、そしてneo4jタグの下にリンクされます。 – InverseFalcon

関連する問題