2016-05-09 3 views
0

せずに結果を取得します。私は取引IDと金額を関係で保存しています、それは良い習慣ですか?今私はユーザーが寄付をしたすべてのプロジェクトをフェッチするクエリを書く必要があります。結果にはprojectIdと一緒に次のプロパティも含める必要があります: {projectId、totalDonation(ユーザー+企業による寄付)、totalDonor(ユーザー+企業)、individualContribution(このプロジェクトでのユーザーの個別貢献、すべての寄付を集計します)、寄付時間(ユーザーが同じプロジェクトに対して複数回寄付した場合、最新のタイムスタンプを選択する必要があります)}}のNeo4jクエリは次のように私のDB内のノードがある重複

ユーザーまたは企業が1回だけ寄付することができるときに私はクエリを書いています。ユーザー/企業が複数回寄付したときに、私は重複プロジェクトを取得しています。

Match (u : User {id : {userId}})-[r:HAVE_DONATED]->(p : Project) with p,r 
where p.status IN ["2", "3"] OPTIONAL MATCH (c)-[r2:HAVE_DONATED]->(p) WITH 
p, COUNT(distinct(c)) as donors, SUM(TOINT(r2.amount)) AS donation, 
r.createdTimeStamp as timestamp, TOINT(r.amount) as individualContribution 
return distinct {totalDonation : donation, id : p.id, title : p.title, 
totalDonors : donors, donationTimeStamp : timestamp , contribution : 
individualContribution} as project order by project.donationTimeStamp desc 

答えて

0

[EDITED]これはあなたの要件に合わせて

MATCH (u:User {id: 123})-[r:HAVE_DONATED]->(p:Project) 
WHERE p.status IN ["2", "3"] 
OPTIONAL MATCH (c)-[r2:HAVE_DONATED]->(p) 
WHERE c <> u 
WITH p, 
    COALESCE(COUNT(distinct(c)), 0) AS c_donors, 
    COALESCE(SUM(TOINT(r2.amount)), 0) AS c_contribution, 
    MAX(r.createdTimeStamp) AS i_timestamp, 
    TOINT(r.amount) AS i_contribution 
RETURN { 
    totalDonation: c_contribution + i_contribution, 
    id: p.id, 
    title: p.title, 
    totalDonors: c_donors + 1, 
    donationTimeStamp: i_timestamp, 
    contribution: i_contribution 
} AS project 
ORDER BY project.donationTimeStamp DESC; 

一つの重要な改善がOPTIONAL MATCH句の後WHERE句の仕様だったが、単一の寄付のためのクエリは、次のとおり。 COALESCE式は、OPTIONAL MATCH句が一致するものを見つけられなかった場合、c_donorsc_contributionsの値がNULLにならないようにします。 createdTimeStampプロパティは数値(エポックタイムスタンプなど)であるか、レキシカルにソートできる文字列形式であると仮定します。 totalDonationとtotalDonorsは、企業と一致するユーザー以外のユーザーからの寄与を持っていないので、

+0

Aプロジェクトは、ユーザからの寄付を持つことができますが、オプションの試合であなただけの会社に一致しています。 – user3542450

+0

OK、私の更新された回答を参照してください。 – cybersam

+0

私のデータベースに3つのノードがあります。 (u1:User) - [:HAVE_DONATED {amount:100}] - >(p1:Project)、(u2:User) - [:HAVE_DONATED {amount:12332}] - >(p1:Project) ) - [:HAVE_DONATED {amount:12344}] - >(p1:プロジェクト)。彼または彼女が複数回寄付した後、このタイムスタンプに従ってソートした場合、最大タイムスタンプは一致するユーザーでなければなりません。私は正しい結果を得ていない。 http://postimg.org/image/3kyglgudd/このURLをご覧ください。 – user3542450

関連する問題