2012-05-08 5 views
0

さて、私はNeo4Jとグラフデータベースの仕組みについてもう少し教えてくれるよう、PHPとNeo4Jを使って小さなアフィリエイトシステムを設計しています。オリジナルのアフィリエイトシステムはMySQLに搭載されていたため、Neo4Jにデザインやストレージを移行するだけでパフォーマンスが向上しなかったのは不条理です。パフォーマンス指向のアフィリエイトシステムデザイン

しかし、私はおそらく間違ってやっている可能性があり、経験豊富な開発者の助けを借りて、それがどれほど優れているかを知りたいと思っているいくつかの機能があります。たとえば、毎月、各アフィリエイトに支払う金額を計算する必要があります。これは、ユーザーネットワーク全体を検索するいくつかのルールに従います。

は例えば、ジョーの毎月の給与を計算するために、システムは、にあります。

Find Node Joe 
function Calculate: 
    Calculate amount of people referred (all tiers) 
    Calculate the number of referral tiers (all tiers) 
    Calculate points 
    Store information inside object properties 
  • 層を:ジョーは、それの順番にボブを指しマリアを指します。 Joeの下でMaryはTier 1、BobはTier 2です。
  • すべての層は:だからジョー、メアリーとボブに基づいて

を数を計算し、計算機能は、再帰関数のように見えます。ジョーに言及されたForeachユーザーは、ジョーに戻って自分の番号を取得するまで、彼と彼の子供の計算機能を実行する必要があります。

これは地獄のように遅いです。私はRabbitMQまたはZMQを使用して、Joeの計算の各「子プロセス」のキューを作成することを考えました。私はpcntlのフォークの使用についても考えました。グラフネットワーク内でこの再帰的プロセスをより良くするにはどうすればよいですか?ツリー全体を通過する最良の方法は何ですか?キューイング?プロセスフォーク?

もう一つの例:

Calculate(Joe) 
    Joe referred Mary, Bob, Peter 
    Calculate(Mary) 
    Mary referred Sara, Megan 
    Calculate(Sara) 
    Calculate(Megan) 
    Calculate(Bob) 
    Bob referred Billy, Michael 
    Calculate(Billy) 
    Calculate(Michael) 
    Calculate(Peter) 
    Peter referred Charles, Max 
    Calculate(Charles) 
    Calculate(Max) 

、500本の紹介を持つ人のためにこれをmultiplicate、そして彼の紹介のそれぞれは、より多くの500人を持つことができます。それは地獄のように遅く、毎月ジョーのダッシュボードにこれを表示しなければなりません。 :(

答えて

2

、あなたがこのグラフ要旨の線に沿って何かを行うことができます:http://tinyurl.com/7vryzwz

基本的に、サイファー(http://docs.neo4j.org/chunked/snapshot/cypher-query-lang.html)クエリが

START referrer=node(1) 
MATCH path=referrer-[:referred*1..]->refferee 
RETURN referrer,refferee, length(path) as generation 
ORDER BY length(path) asc 

その助けをいているのですか?

/ピーター

+0

はい、少しですが、ジョーの下に子ノードがなくなるまで、各子ノードでCalculate関数を実行する必要があります。これはPHPで行われます。この問題は実際には岩であるNeo4Jではなく、プロセッサ上の爆弾である再帰的なツリートラバーサル関数である。 ZeroMQやRabbitMQが役に立つかもしれないと思うのは、さまざまなCalculate関数をキューに入れて、ただ1つのコアを使うのではなく、並行してそれらが終了するのを待つことだけです。 – vinnylinux

0

は、それはあまりにも難しいことではありません。

するたびに新しいアフィリエイトサインアップ(または彼らがアフィリエイトとしてカウントされるレベルに達する)、ゼロから始めるべきであるアフィリエイターのAffiliate回数に「1」を追加しますそうしながら。..ずっとアップアフィリエイターさんのチェーンを移動

ボブはアンにもたらしフレッドにもたらします。

アンがサインアップすると、フレッドは1を受け取り、ボブが受け取ります+ 1(または、必要に応じてAnneがティア2のように+1未満を受け取ることができます)

これはボトムアップアプローチであり、所属ネットワークは樹木(森林)の束であるため、より効果的です。あなたは葉から枝にかけて幹に行く。それはまた、人事成績の絶えず更新している統計を提示できることを意味します。 Neo4jとサイファーと

+0

これはあまりにも単純です。これはすでにNeo4j(Joe - > references - > Mary)のノード関係を使って行われています。ツリーのトラバーサルは非常に簡単ですが、問題はパフォーマンスです。それは木を作ることではありません。 – vinnylinux

+0

ツリーがある場合、すべての子の値を合計する唯一の方法は、すべての子をループすることです。他の方法はありません。再帰の代わりにスタックを使用することはできますが、実際のパフォーマンスの向上を得るための唯一の方法は、発生したアフィリエーションの追跡です。 – DanRedux

+0

もちろん、私はすべての子供をループする必要があります。私は何を求めているのか、そしておそらく私は明確ではなかったでしょう、ループする最良の方法です。プロセスフォークの使用?メッセージキュー? – vinnylinux

関連する問題