(57)【要約】      （修正有）【課題】並列検索アプリケーションによって、顧客に対する推奨を生成するシステムを提供する。【解決手段】頂点をプロセッサに動的に割り当てて、顧客に対する推奨を生成する。顧客および商品の頂点、ならびに購買行動の辺を有するグラフデータを受信する１１０２。顧客の頂点から商品の頂点の集合へのグラフを探査する１１０６。商品の頂点の集合をプロセッサの集合の間で分割する１１０８。その後、各プロセッサに関する商品の最先端の頂点の集合を決定し、商品の最先端の頂点から商品の頂点の集合へのグラフを探査する１１１０。顧客の頂点の集合をプロセッサの集合の間で分割し、各プロセッサに関する顧客の最先端の頂点を決定する１１１２。顧客の最先端の頂点の集合から推奨可能な商品の頂点の集合へのグラフを探査する１１１４。その顧客に関する１つ以上の商品の推奨を生成する１１１６。【選択図】図１１
2015076093.tif 000002
【特許請求の範囲】
【請求項１】
頂点をプロセッサに動的に割り当てて、顧客に対する推奨を生成する、コンピュータで実行可能な方法であって
グラフの頂点と辺を示すグラフデータを受信するステップであって、前記頂点が顧客と商品を表し、前記辺が購買行動を表す、ステップと、
前記グラフデータに基づいて、前記顧客を表す頂点を決定するステップと、
前記顧客を表す前記頂点から商品を表す頂点の集合への前記グラフを探索するステップと、
前記商品を表す頂点の集合を前記プロセッサの集合の間で分割するステップと、  
前記プロセッサの集合内のプロセッサごとに、商品を表す最先端の頂点の集合を決定するステップと、
前記プロセッサの集合により、商品を表す最先端の頂点の集合から顧客を表す頂点の集合への前記グラフを探索するステップと、
前記顧客を表す頂点の集合をプロセッサの集合の間で分割するステップと、
顧客を表す最先端の頂点の集合を前記プロセッサの集合内のプロセッサごとに決定するステップと、
前記プロセッサの集合により、前記顧客を表す最先端の頂点の集合から推奨可能な商品を表す頂点の集合への前記グラフを探査するステップと、
前記推奨可能な商品を表す頂点の集合に基づいて、前記顧客に対する商品の推奨を生成するステップと、を含む方法。
【請求項２】
前記顧客を表す頂点の集合をプロセッサの集合の間で分割するステップには、
プロセッサ「ｐ」に関する「Ｕ」→「Ｖ」の最先端の頂点の集合が空でない場合、「ｐ」番目のビット値であるＭＵ［ｐ］が「１」となるよう、ビットマスク「ＭＵ」を生成することであって、ここで、「Ｕ」は前記顧客の集合の表し、「Ｖ」は前記商品の集合を表す、ことと、
プロセッサ「ｐ」に関する「Ｕ」→「Ｖ」の最先端の頂点の集合が空の場合、「ｐ」番目のビット値であるＭＵ［ｐ］が「０」となるよう、ビットマスク「ＭＵ」を生成することと、
ＭＵ［ｐ］が「１」の場合、顧客を表す最先端の頂点をプロセッサ「ｐ」に割り当てることと、がさらに含まれる、請求項１に記載の方法。
【請求項３】
前記顧客を表す頂点の集合をプロセッサの集合の間で分割するステップには、
式
【数１】
2015076093.tif 000022
に従って、各プロセッサに割り当てられる頂点の最大数を推定することであって、「Ｐ」はプロセッサの数であり、「ｕｍａｘ」は頂点∈Ｕに関する最大整数識別子であり、「ｕｍｉｎ」は頂点∈Ｕに関する最小整数識別子であり、「Ｕ」は前記顧客の集合を表す、ことと、
各プロセッサに割り当てられる、前記推定された頂点の最大数に基づいて、前記顧客を表す頂点の集合を前記プロセッサの集合の間で均一に分割することと、がさらに含まれる、請求項１に記載の方法。
【請求項４】
前記顧客を表す頂点の集合をプロセッサの集合の間で分割するステップには、
前記顧客を表す頂点の集合を前記プロセッサの集合の間で非均一に分割することがさらに含まれる、請求項１に記載の方法。
【請求項５】
前記商品を表す頂点の集合をプロセッサの集合の間で分割するステップには、
プロセッサ「ｐ」に関する「Ｖ」→「Ｕ」の最先端の頂点の集合が空でない場合、「ｐ」番目のビット値であるＭＶ［ｐ］が「１」となるよう、ビットマスク「ＭＶ」を生成することであって、ここで「Ｖ」は前記商品の集合を表し、「Ｕ」は前記顧客の集合の表す、ことと、
プロセッサ「ｐ」に関する「Ｖ」→「Ｕ」の最先端の頂点の集合が空の場合、「ｐ」番目のビット値であるＭＶ［ｐ］が「０」となるよう、ビットマスク「ＭＶ」を生成することと、
ＭＶ［ｐ］が「１」の場合、商品を表す最先端の頂点をプロセッサ「ｐ」に割り当てることと、がさらに含まれる、請求項１に記載の方法。
【請求項６】
前記商品を表す頂点の集合をプロセッサの集合の間で分割するステップには、
式
【数２】
2015076093.tif 000023
に従って、各プロセッサに割り当てられる頂点の最大数を推定することであって、「Ｐ」はプロセッサの数であり、「ｖｍａｘ」は頂点∈Ｖに関する最大整数識別子であり、「ｖｍｉｎ」は頂点∈Ｖに関する最小整数識別子であり、「Ｖ」は前記商品の集合を表す、ことと、
各プロセッサに割り当てられる、前記推定された頂点の最大数に基づいて、前記商品を表す頂点の集合を前記プロセッサの集合の間で均一に分割することと、がさらに含まれる、請求項１に記載の方法。
【請求項７】
前記商品を表す頂点の集合をプロセッサの集合の間で分割するステップには、
前記商品を表す頂点の集合を前記プロセッサの集合の間で非均一に分割すること、がさらに含まれる、請求項１に記載の方法。
【請求項８】
前記グラフは一般グラフであって、
源点の集合をプロセッサの集合の間で分割することと、
プロセッサ「ｐ」に関する最先端の源点の集合が空でない場合、「ｐ」番目のビット値であるＭＳ［ｐ］が「１」となるよう、ビットマスク「ＭＳ」を生成することと、
プロセッサ「ｐ」に関する最先端の源点の集合が空の場合、「ｐ」番目のビット値であるＭＳ［ｐ］が「０」となるよう、ビットマスク「ＭＳ」を生成することと、
ＭＳ［ｐ］が「１」の場合、商品を表す最先端の源点をプロセッサ「ｐ」に割り当てることと、がさらに含まれる、請求項１に記載の方法。
【請求項９】
コンピュータにより実行されると、前記コンピュータが、頂点をプロセッサに動的に割り当てて、顧客に対する推奨を生成する方法を行う命令を格納する、コンピュータ可読記憶媒体であって、前記方法が、
グラフの頂点と辺を示すグラフデータを受信するステップであって、前記頂点が顧客と商品を表し、前記辺が購買行動を表す、ステップと、
前記グラフデータに基づいて、前記顧客を表す頂点を決定するステップと、
前記顧客を表す前記頂点から商品を表す頂点の集合への前記グラフを探索するステップと、
前記商品を表す頂点の集合を前記プロセッサの集合の間で分割するステップと、
前記プロセッサの集合内のプロセッサごとに、商品を表す最先端の頂点の集合を決定するステップと、
前記プロセッサの集合により、商品を表す最先端の頂点の集合から顧客を表す頂点の集合への前記グラフを探索するステップと、
前記顧客を表す頂点の集合をプロセッサの集合の間で分割するステップと、
顧客を表す最先端の頂点の集合を前記プロセッサの集合内のプロセッサごとに決定するステップと、を含む、コンピュータ可読記憶媒体。
【請求項１０】
頂点をプロセッサに動的に割り当てて、顧客に対する推奨を生成するコンピュータシステムであって、
１つ以上のプロセッサと、
前記１つ以上のプロセッサと接続するコンピュータ可読媒体であって、その中に命令が格納され、前記命令が、前記１つ以上のプロセッサにより実行されると、前記１つ以上のプロサッサが、
グラフの頂点と辺を示すグラフデータを受信する動作であって、前記頂点が顧客と商品を表し、前記辺が購買行動を表す、動作と、
前記グラフデータに基づいて、前記顧客を表す頂点を決定する動作と、
前記顧客を表す前記頂点から商品を表す頂点の集合への前記グラフを探索する動作と、
前記商品を表す頂点の集合を前記プロセッサの集合の間で分割する動作と、
前記プロセッサの集合内のプロセッサごとに、商品を表す最先端の頂点の集合を決定する動作と、
前記プロセッサの集合により、商品を表す最先端の頂点の集合から顧客を表す頂点の集合への前記グラフを探索する動作と、
前記顧客を表す頂点の集合をプロセッサの集合の間で分割する動作と、
顧客を表す最先端の頂点の集合を前記プロセッサの集合内のプロセッサごとに決定する動作と、
前記プロセッサの集合により、前記顧客を表す最先端の頂点の集合から推奨可能な商品を表す頂点の集合への前記グラフを探査する動作と、
前記推奨可能な商品を表す頂点の集合に基づいて、前記顧客に対する商品の推奨を生成する動作と、を含む動作を実行する、コンピュータ可読媒体と、を含むコンピュータシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示はグラフ検索に関し、より具体的には、グラフを並列処理する方法およびシステムに関する。
【背景技術】
【０００２】
多くの分析アプリケーションでグラフが登場してきた。グラフの重要なクラスは２部グラフであり、この２部クラスでは、全ての辺が「Ｕ」内の頂点と「Ｖ」内の頂点を接続し、かつ「Ｕ」内の頂点と「Ｖ」内の頂点だけを接続するように頂点の集合を２つの互いに素な集合「Ｕ」と「Ｖ」に分割することができる。「Ｕ」内の２つの頂点間、あるいは「Ｖ」内の２つの頂点間には辺が存在しないため、２部グラフは異常な長さのサイクルを全く含んでいない。
【０００３】
形式上、２部グラフ「Ｇ」は、（Ｕ，Ｖ，Ｅ）で表され、ある頂点は「Ｕ」内または「Ｖ」内のどちらかに存在し、かつ
【数１】
2015076093.tif 000003
である。グラフ「Ｇ」内に頂点「ｕ」から頂点「ｖ」に有向辺が存在する場合、およびその場合に限って、辺の集合「ｅ∈Ｅ」が存在し、辺「ｅ」が（ｕ，ｖ）の形式で表される。この場合、頂点「ｕ」は辺「ｅ」の源点かつ頂点「ｖ」の前方頂点であり、頂点「ｖ」は辺「ｅ」の終点かつ頂点「ｕ」の後方頂点である。グラフ「Ｇ」が無向性の場合、「∀（ｕ，ｖ）∈Ｅ→（ｖ，ｕ）∈Ｅ」となる。「｜Ｕ｜＝｜Ｖ｜」の場合、このグラフ「Ｇ」はバランスのとれた２部グラフと呼ばれる。図１Ａには、有向２部グラフ１０の一例が示されており、このグラフ１０では、「Ｕ」内の頂点１２、１４、１６、１８、および２０だけが辺の源点となることができ、集合「Ｖ」の頂点２２、２４、２６、および２８だけが辺の終点となることができる。
【０００４】
２部グラフは、多くの実在の現象の自然なモデルである。図１Ａには、有向２部グラフの一例が示されている。ある例では、図１Ａの集合「Ｕ」内の頂点の集合により顧客の集合をモデル化することができ、「Ｖ」内の頂点の集合により商品の集合をモデル化することができる。「ｕ∈Ｕ」と「ｖ∈Ｖ」の間の辺により、顧客「ｕ」が商品「ｖ」を購入したことを表すことができる。このような２部グラフをさらに分析して、顧客（複数可）の購入履歴に基づいて、推奨すべき正しい商品（複数可）を見つけ出すなどの価値ある洞察力を決定することができる。
【０００５】
２部グラフを効率的に分析するうえで大きな問題となるのは、頂点と辺の数が増えるにつれ検索が困難になることである。幸運なことに、２部グラフは、通常、演算の速度アップに活用可能な大規模な構造を含んでいる。例えば、２部グラフ内には同じ長さのサイクルだけが存在し得る。さらに、１つの頂点「ｕ∈Ｕ」は、別の頂点「ｖ∈Ｖ」にだけ繋がることができ、その逆も同様である。しかし、時には、検索アルゴリズムによりこの２部グラフの構造が適切に利用されなければ、演算が非効率的なものになる可能性もある。１つの例として、２部グラフの頂点を複数の領域に分割して、各領域が約「（｜Ｖ｜＋｜Ｕ｜）／Ｐ」個の頂点（Ｐは並列のプロセッサの数）を含み、同じ領域内の頂点を同じプロセッサに割り当てるようにする、並列検索アプリケーションを考慮してみることにする。検索中、全てのプロセッサの稼働状態を維持することが目標であるが、このような静的な頂点−プロセッサの割り当て方式では、２部グラフに対してうまく機能しない。例えば、検索が「Ｕ」または「Ｖ」のどちらかに（しかし両方でない）存在する頂点または複数の頂点からスタートする場合、この検索では、全ての単一の探査ステップで、（ｕ，ｖ）または（ｖ，ｕ）の形式の辺（「ｕ∈Ｕ」および「ｖ∈Ｖ」である）に沿ってのみ探索するが、両方は辺に沿っては探索しない。なお、探査ステップとは、アプリケーションまたはシステムが、頂点「ｕ」から頂点「ｖ」に繋がる辺を分析することにより、前方頂点「ｕ」の後方頂点「ｖ」を判定する動作である。これは、この２つの条件のうちの一方が単一の探査ステップ内に留まっていなければならないことを示唆している。
１．源点が「ｕ∈Ｕ」である全ての辺は、探査の対象とはならない。または
２．源点が「ｖ∈Ｖ」である全ての辺は、探査の対象とはならない。
【０００６】
すなわち、「Ｕ∈Ｖ」内の頂点の集合がどのように分割され、その後、プロセッサに割り当てられるかに関係なく、単一の探査ステップ内では、有用な演算が全く行われないことが保証される、頂点の部分集合に縛られ、それにより、２部グラフにおける並列検索の効率性が奪われてしまう。所与の探査ステップにおいて、後方頂点を全く持たない頂点をアイドル頂点と呼ぶ。但し、探査方向にかかわらず、隣接する頂点を持たない（例えば、前方頂点または後方頂点のない）頂点は間違いなくアイドル頂点であったとしても、通常、その頂点がアイドル頂点かそうでないかは探査の方向に依存する。
【０００７】
いかにアイドル頂点が並列検索に影響を及ぼすかを見るために、「Ｕ」が１，０００，０００人の顧客を表し、「Ｖ」が１，０００個の商品を表すケースを考察する。簡潔にするために、顧客の頂点には＃０番から＃９９９，９９９番までの番号を付け、商品の頂点には＃１，０００，０００番から＃１，０００，９９９番までの番号を付けるものと仮定しよう。１，０００個のプロセッサが使用可能で、タスクは過去に少なくとも１つの商品を購入した顧客を見つけ出すことと想定する。グラフの２部構造を無視した場合、並列検索アプリケーションは、１，０００，０００人の顧客の頂点と、それに加えて、１，０００個の商品の頂点との全ての集合を１，０００個の領域に分割する。これらの領域には、それぞれ（１，０００，０００人＋１，０００個）／１０００＝１，００１個の頂点が含まれている。これは、アプリケーションにより、第１のプロセッサに＃０番から＃１，０００番までの処理頂点が割り当てられ、第２のプロセッサに＃１，００１番から＃２，００１番までの処理頂点が割り当てられ、そして、最後のプロセッサに（１，０００番目のプロセッサ）を＃９９９，９９９番から＃１，０００，９９９番までの処理頂点が割り当てられることを意味する。しかし、このケースでは、最後のプロセッサだけが有用な演算を行ったであろう。これは、このアプリケーションは、他の全ての９９９個のプロセッサに顧客を表すアイドル頂点を割り当てるが、「Ｖ」（商品）から「Ｕ」（顧客）の探査方向では、商品の頂点だけが後方頂点を生成できるためである。皮肉なことに、このアプリケーションは最後のプロセッサに、どの商品−顧客の探査にも含まれる必要はない、最後の顧客を表すアイドル頂点（＃９９９，９９９番目）をさらに割り当てる。１，０００個のプロセッサのうちの１個だけしか有効に機能しないため、速度は上がらず、並列の効率性もたった１／１，０００＝０．１％だけとなる。
【発明の概要】
【発明が解決しようとする課題】
【０００８】
上記の例では、並列検索アプリケーションによって適切に活用されなければ、２部グラフの構造には問題がある可能性があることが示されている。あるアプローチにおいて、並列検索アプリケーションにより、商品の頂点と、＃０番から＃１，０００，９９９番までの一つに統合された範囲の顧客の頂点とを混ぜ合わせた場合、並列の効率性は向上するであろう。しかし、１，０００人の顧客ごとにきっちりと１つの商品の頂点が混ぜ合わされることが生じなければ、並列の効率性は依然として１００％にはならない。つまり、最初の１，０００個の頂点（＃０番目〜＃９９９番目）は顧客であり、その後に１つの商品の頂点（＃１，０００番目）が続き、次いで、別の１，０００人の顧客（＃１，００１番目〜＃２，０００番目）が続き、別の商品の頂点（＃２，００１番目）がまたそれに続き、これを繰り返す。しかし、１つの種類の頂点ＩＤを別の種類の頂点ＩＤに混ぜ合わせることにより、グラフのオリジナルの構造を危険にさらし、頂点ＩＤから種類へのマッピングの管理において、付加的な時間と空間のオーバヘッドが生じる可能性がある。これらの短所を考慮すると、より好適なアプローチが望まれる。
【課題を解決するための手段】
【０００９】
本発明の一実施形態では、頂点をプロセッサに動的に割り当てて、顧客に対する推奨を生成するシステムが提供される。動作中、このシステムは、グラフの頂点と辺を示すグラフデータを受信する。頂点は顧客と商品を表し、辺は購買行動を表す。次に、このシステムは、グラフデータに基づいて、顧客を表す頂点を決定する。次いで、このシステムは、顧客を表す頂点から商品を表す頂点の集合へのグラフを探査する。このシステムは、商品を表す頂点の集合をプロセッサの集合の間で分割する。この後、このシステムは、プロセッサの集合内のプロセッサごとに商品を表す最先端の頂点の集合を決定する。このシステムは、このプロセッサの集合を用いて、商品を表す最先端の頂点の集合から顧客を表す頂点の集合へのグラフを探査する。このシステムは、顧客を表す頂点の集合をプロセッサの集合の間で分割する。次いで、このシステムは、プロセッサの集合内のプロセッサごとに、最先端の顧客を表す頂点の集合を決定する。このシステムは、このプロセッサの集合を用いて、最先端の顧客を表す頂点の集合から推奨可能な商品を表す頂点の集合へのグラフを探査する。次いで、このシステムは、推奨可能な商品を表す頂点の集合に基づいて、顧客に対する１つ以上の商品の推奨を生成する。
【００１０】
この実施形態の変更形態において、顧客を表す頂点の集合をプロセッサの集合の間で分割するステップには、プロセッサ「ｐ」に関する「Ｕ」→「Ｖ」の最先端の頂点の集合が空でない場合、ｐ番目のビット値であるＭＵ［ｐ］が「１」となるようにビットマスク「ＭＵ」を生成し、プロセッサ「ｐ」に関する「Ｕ」→「Ｖ」の最先端の頂点の集合が空の場合、ｐ番目のビット値であるＭＵ［ｐ］が０となるようにビットマスク「ＭＵ」を生成することと、ＭＵ［ｐ］が１の場合、顧客を表す最先端の頂点をプロセッサ「ｐ」に割り当てることと、が含まれ、「Ｕ」は顧客の集合を表し、「Ｖ」は商品の集合を表す。
【００１１】
この実施形態の変更形態において、顧客を表す頂点の集合をプロセッサの集合の間で分割するステップには、式
【数２】
2015076093.tif 000004
に従って、各プロセッサに割り当てられる頂点の最大数を推定することと、この各プロセッサに割り当てられる推定された頂点の最大数に基づいて、顧客を表す頂点の集合をプロセッサの集合の間で均一に分割することと、が含まれ、「Ｐ」はプロセッサの数であり、「ｕｍａｘ」は頂点∈Ｕに関する最大整数識別子であり、「ｕｍｉｎ」は頂点∈Ｕに関する最小整数識別子である。
【００１２】
この実施形態の変更形態において、顧客を表す頂点の集合をプロセッサの集合の間で分割するステップには、顧客を表す頂点の集合をプロセッサの集合の間で非均一に分割することがさらに含まれる。
【００１３】
この実施形態の変更形態において、商品を表す頂点の集合をプロセッサの集合の間で分割するステップには、プロセッサ「ｐ」に関する「Ｖ」→「Ｕ」の最先端の頂点の集合が空ではない場合、ｐ番目のビット値であるＭＶ［ｐ］が「１」となるようにビットマスク「ＭＶ」を生成し、プロセッサ「ｐ」に関する「Ｖ」→「Ｕ」の最先端の頂点の集合が空の場合、ｐ番目のビット値であるＭＶ［ｐ］が「０」となるようにビットマスク「ＭＶ」を生成すること、ＭＶ［ｐ］が１の場合、商品を表す最先端の頂点をプロセッサ「ｐ」に割り当てることと、が含まれ、「Ｕ」は顧客の集合を表し、「Ｖ」は商品の集合を表す。
【００１４】
この実施形態の変更形態において、商品を表す頂点の集合をプロセッサの集合の間で分割するステップには、式
【数３】
2015076093.tif 000005
に従って、各プロセッサに割り当てられる頂点の最大数を推定することと、この各プロセッサに割り当てられる推定された頂点の最大数に基づいて、商品を表す頂点の集合をプロセッサの集合の間で均一に分割することと、が含まれ、「Ｐ」はプロセッサの数であり、「ｖｍａｘ」は頂点∈Ｖに関する最大整数識別子であり、「ｖｍｉｎ」は頂点∈Ｖに関する最小整数識別子である。
【００１５】
この実施形態の変更形態において、商品を表す頂点の集合をプロセッサの集合の間で分割するステップには、商品を表す頂点の集合をプロセッサの集合の間で非均一に分割することが含まれる。
【００１６】
この実施形態の変更形態において、このグラフは一般グラフであり、このシステムは、プロセッサ「ｐ」に関する最先端の源点の集合が空でない場合、ｐ番目のビット値であるＭＳ［ｐ］が１となるように、ビットマスク「ＭＳ」を生成し、プロセッサ「ｐ」に関する最先端の源点の集合が空の場合、ｐ番目のビット値であるＭＳ［ｐ］が０となるように、ビットマスク「ＭＳ」を生成し、ＭＳ［ｐ］が１の場合、最先端の源点をプロセッサ「ｐ」に割り当てることにより、源点の集合をプロセッサの集合の間で分割する。
【図面の簡単な説明】
【００１７】
【図１Ａ】図１Ａは、有向２部グラフの一例を示す図である。
【図１Ｂ】図１Ｂは、一実施形態に従った、グラフ探査技術を用いたグラフ演算システムの例示的なアーキテクチャを示すブロック図である。
【図２】図２は、最良のケースの並列効率性を「Ｕ」と「Ｖ」のサイズの割合の関数として示すグラフである。
【図３】図３は、例示的な準２部グラフを示すブロック図である。
【図４】図４は、検索の最先端を要約した例示的なビットマスクを示すブロック図である。
【図５】図５は、例示的な２部グラフの検索の最先端、およびそれに対応する静的なビットマスクを示すブロック図である。
【図６】図６は、一実施形態に従った、例示的な「Ｕ」→「Ｖ」の検索の最先端、およびそれに対応する動的なビットマスクを示すブロック図である。
【図７】図７は、一実施形態に従った、例示的な「Ｖ」→「Ｕ」の検索の最先端、およびそれに対応する動的なビットマスクを示すブロック図である。
【図８】図８は、一実施形態に従った、「Ｕ」→「Ｖ」の探査に関して、頂点をプロセッサに動的に割り当てる例示的な処理を示すフローチャートである。
【図９】図９は、一実施形態に従った、「Ｖ」→「Ｕ」の探査に関して、頂点をプロセッサに動的に割り当てる例示的な処理を示すフローチャートである。
【図１０】図１０は、一実施形態に従った、一般グラフにおける源点から終点への探査に関して、頂点をプロセッサに動的に割り当てる例示的な処理を示すフローチャートである。
【図１１】図１１は、一実施形態に従った、グラフ探査に関する、開示されたプロセッサの使用技術を用いた、商品に関する推奨を生成するための例示的な処理を示すフローチャートである。
【図１２】図１２は、一実施形態に従った、探査に関して最先端の頂点をプロセッサに動的に割り当てることを容易にする、例示的な装置を示すブロック図である。
【図１３】図１３は、一実施形態に従った、探査に関して頂点をプロセッサに動的に割り当てることを容易にする、例示的なコンピュータシステムを示すブロック図である。
【００１８】
図面に関して、同様の参照符号は、同じ番号の構成要素を指す。
【発明を実施するための形態】
【００１９】
本発明の実施形態では、探査のために頂点をプロセッサに動的に割り当てることにより、グラフ探査のためのプロセッサの非効率的な使用という問題を解決する。頂点をプロセッサに静的に割り当てるグラフ演算システムでは、グラフの探査中に、特定の頂点専用のいくつかのプロセッサが、アイドル状態のままになっているため、プロセッサリソースを十分に活用できていない。このグラフ演算システムは、プロセッサを頂点に静的に割り当てるのではなく、本明細書に開示された技術を用いて、頂点をプロセッサに動的に割り当てることができ、これにより、プロセッサリソースを最大限に利用することが可能となる。
【００２０】
本開示では、２部グラフ、準２部グラフ、および一般グラフを検索し探索するときに、プロセッサのリソースを完全に利用する技術について議論する。準２部グラフとは、１つの区画内に存在する辺を有する２部グラフのことである。このシステムは、グラフ探査ステップごとに最先端の頂点を各プロセッサに動的に割り当てる。最先端の頂点とは、プロセッサが、探査ステップのために処理しなければならない頂点のことである（例えば、商品の推奨を必要とする顧客を表す頂点）。例えば、「Ｕ」内の頂点の集合、および「Ｖ」内の頂点の集合を有する２部グラフに関して、システムが、「Ｕ」内の頂点（例えば、顧客の頂点）から「Ｖ」内の頂点（例えば、商品の頂点）への探査を行うとき（「Ｕ」→「Ｖ」と表される）、このシステムは、最先端の集合「Ｕ」内の頂点を全てのプロセッサに動的に割り当てることが可能である。これにより、このシステムの処理能力をフル活用することができる。同様に、このシステムは、「Ｖ」内の頂点から「Ｕ」内の頂点への探査を行うとき（「Ｖ」→「Ｕ」と表される）、このシステムは、最先端の「Ｖ」内の頂点を全てのプロセッサに動的に割り当てる。なお、このシステムは、プロセッサの間で、均一または非均一に頂点を分割することができる。
【００２１】
これとは対照的に、頂点をプロセッサに割り当てる標準の静的なアプローチでは、例えば、１０個中７個のプロセッサを割り当てて「Ｕ」→「Ｖ」の探査を管理し、１０個中３個のプロセッサを割り当てて「Ｖ」→「Ｕ」の探査を管理している。標準の静的なアプローチのもとでは、このシステムは「Ｕ」→「Ｖ」の探査を行うときに、１０個中３個のプロセッサを使用していない。さらに、このシステムは「Ｖ」→「Ｕ」の探査を行うときに、１０個中７個のプロセッサを使用していない。この静的なアプローチでは、プロセッサのリソースの使用を最大にできず、頂点をプロセッサに動的に割り当てることにより、このアプローチを回避することができる。
【００２２】
以下のセクションでは、グラフ演算システムのアーキテクチャについて説明する。この説明では、最良のケースの並列の効率性について分析し、ビットマスクのコンセプトを紹介し、かつ動的な頂点−プロセッサのマッピング方式について議論する。「Ｕ」→「Ｖ」の探査のために、頂点をプロセッサに動的に割り当てる処理、「Ｖ」→「Ｕ」の探査のために、頂点をプロセッサに動的に割り当てる処理、一般グラフにおける源点から終点の探査のために、頂点をプロセッサに動的に割り当てる処理などのいくつかの処理の例もこの議論には含まれる。最終的に、下記のセクションでは、商品に関する推奨を生成するための例示的な処理、および探査のために頂点をプロセッサに動的に割り当てる装置およびシステムを開示する。
【００２３】
図１Ｂには、一実施形態に従った、グラフ探査技術を用いた、グラフ演算システム１００の例示的なアーキテクチャのブロック図が示されている。グラフ演算システム１００は、グラフの頂点を分割し、複数のプロセッサを用いて、それらの頂点を処理することができる。グラフ演算システム１００は、グラフを検索し探査して、協調フィルタリングなどの種々のアプリケーションを容易にすることができる。標準的なシステムでは、システム１００は、所定の静的な割り当てに従って、頂点をプロセッサに割り当てることにより、グラフの頂点の探査を行う。しかし、本明細書に開示された技術を用いることにより、このシステム１００は、頂点を動的に分割し、分割された頂点をプロセッサに動的に割り当てる。これにより、プロセッサのリソース使用を改善する。
【００２４】
グラフ演算システム１００は、サーバ１０６に接続した記憶装置１０４にインストールされたグラフ管理モジュール１０２を含むことができる。なお、本発明の種々の実装形態では、いくつものサーバおよび記憶装置を含むことができる。種々の実装形態では、グラフ管理モジュール１０２は、本明細書に記載される技術を実行するために、グラフ分析エンジン、またはその他のグラフ演算システム１００の構成要素を含むことができる。システム１００は、頂点と辺を記述したデータを受信し、そのデータを記憶装置１０４内に格納することがきる。システム１００は、グラフ管理モジュール１０２に関するコード、ならびに頂点および辺１０８に関するデータを記憶装置１０４から読み出すことができる。システム１００は、頂点を動的に分割し、それらの頂点をプロセッサ１１０Ａ〜１１０Ｈなどのプロセッサに動的に割り当てる。そして、これらのプロセッサは、割り当てられた頂点上で動作する。
【００２５】
図２には、最良のケースの並列効率性を「Ｕ」と「Ｖ」のサイズの割合の関数として示すグラフが示されている。図２には、以下の３つのケースに関する、「Ｕ」と「Ｖ」のサイズの割合の関数としての、理論上の最良のケースの並列効率性（プロセッサの数で割った、速度の増加分として計測された）が示されている。
１．「Ｕ」→「Ｖ」の効率性：「Ｕ」内の頂点から「Ｖ」内の頂点への単一の探査ステップに関する並列の効率性。
２．「Ｖ」→「Ｕ」の効率性：「Ｖ」内の頂点から「Ｕ」内の頂点への単一の探査ステップに関する並列の効率性。
３．平均の効率性：それぞれ同じ重みを付けられた、上記の１および２の平均の効率性。
【００２６】
上記に見られるように、｜Ｖ｜に対する｜Ｕ｜の割合が高くなると、「Ｕ」→「Ｖ」の方向における探査ステップに関する最良のケースの並列効率性は向上するが、同時に、「Ｖ」→「Ｕ」の方向における探査に関する効率性は低下する。探査の２つの方向が同じように重要な場合、｜Ｕ｜と｜Ｖ｜の間の割合には関係なく最良のケースのシナリオでも、全体として並列効率性はたった５０％である。但し、並列法の種々のステージにおけるオーバヘッドがあるため、実際の効率性はこれより低い可能性だけはあり得る。
【００２７】
探査の一方の方向が、他方の方向よりもより重要なアプリケーションでは、５０％の平均の効率性は、ゆるい上限になるだけである。上記に説明した「ｃｕｓｔｏｍｅｒ−ｂｏｕｇｈｔ−ｐｒｏｄｕｃｔ」の例では、クラシックアプリケーションは、次の協調フィルタに基づいて、推奨を生成するためのものである。
ステップ１：顧客の頂点からスタートし、その顧客により購入された商品の集合を見つけ出す。
ステップ２：これらの商品のうちの少なくとも１つを購入した他の顧客を見つけ出す。
ステップ３：これらの顧客に購入された最も人気のある商品を見つけ出す。
【００２８】
なお、ステップごとに必要な演算の量は著しく異なる可能性がある。ステップ１では、単一の頂点からのグラフ探査だけが必要であり、この探査は比較的コストがかからない。ステップ２では、一般に、複数の商品の頂点からの探査を必要とし、それに加えて、顧客が過去に１つ超の商品を購入しており、さらに、単一の顧客が少数の商品を購入する可能性がある一方で、（特に人気の）単一の商品が数千人、もしかすると数百万の顧客に購入されるかもしれない。すなわち、ステップ２は複数の頂点の処理を必要とするだけでなく、それぞれの頂点で非常に大量の演算を実行する必要がある。したがって、ステップ１よりも数桁多い数の辺を探索することはステップ２にとってはよくあることであり、これにより、「Ｖ」（商品）から「Ｕ」（顧客）の探査方向が、その反対方向よりもコンピュータ的に集約的になる。一般には、商品の種類よりも多くの顧客が存在するので、「｜Ｕ｜≧｜Ｖ｜」と想定する方がその逆より安全である。
【００２９】
図２によると、「｜Ｕ｜＝｜Ｖ｜」、例えば、バランスのとれた２部グラフの場合、ステップ２に関する最良のケースの並列効率性は理論上５０％である。しかし「｜Ｕ｜＝１０｜Ｖ｜」、例えば、商品の種類の１０倍よりも多くの顧客が存在する場合、ステップ２では、理論上せいぜい９．１％の並列の効率性しか実現することができない。さらに、商品の１００倍または１，０００倍のより多い顧客が存在する場合、さらに並列の効率性は、それぞれ１％および０．１％に落ち込むであろう。ビジネスでは、数百万人（以上）の顧客を相手に数千（以下）の商品の種類を扱うことは、珍しくないため、実際には、０．１％以下の並列効率性が発生する。
【００３０】
頂点をプロセッサに割り当てるとき、並列検索アプリケーションにより、「Ｕ」と「Ｖ」が区別されることがないという前提に基づいて、今までの分析がなされてきた。グラフは２部グラフで、行われる探査は「Ｕ」→「Ｖ」（または「Ｖ」→「Ｕ」）であることを示すデータをアプリケーションが前もって受信している場合、このアプリケーションは「Ｕ」の頂点（または「Ｖ」頂点）をプロセッサに割り当てるだけでよく、問題は解決される。しかし、これは全体的な解決策とは言えない、というのも、（ａ）グラフが２部グラフかどうかをテストすることは、コンピュータ的にコストがかかる可能性があり、（ｂ）非２部グラフでは、依然として同じ問題を表面化させる同様の構造を有する可能性があるからである。
【００３１】
図３には、例示的な準２部グラフのブロック図が示されている。図３の矢印３０２により表される辺を無視した場合、このグラフは２部グラフになる。同じ並列の問題が準２部グラフでも発生することが分かる。
【００３２】
グラフが２部グラフであり、アプリケーションがこの情報を受信したとしても、アプリケーションがこれらの頂点の部分集合の処理を行うことだけが必要であれば、「Ｕ」または「Ｖ」内の全ての頂点をプロセッサに割り当てることは、まだ準最適な段階であると言えよう。協調フィルタの例のステップ１では、アプリケーションは「Ｕ」内の単一の頂点を処理することだけが必要であり、これは、その顧客が推奨を受信し、残りの９９９，９９９人の顧客は処理を必要としないことを表している。顧客が全ての商品の部分集合を購入するだけの場合、ステップ２でも同様の問題が起こり得る。「Ｕ」または「Ｖ」のどちらかの全ての頂点を列挙することなしに、検索の最前線上の頂点（例えば、処理される必要のある商品）を効率的に見つけ出すことが課題となり得る。
【００３３】
図４には、検索の最先端４０１を要約した例示的なビットマスク４００のブロック図が示されている。図４には、８ビットのビットマスクを用いて０番から３１番の番号を付けられたＩＤを有する３２個の頂点を含むグラフに関する、現在の検索の最先端の要約が表す例が示されている。検索の最先端４０１に関して、網掛けされたブロックは検索の最先端上の頂点を表し、空のブロックは非最先端の頂点を表す。例えば、ブロック４０２、４０４、および４０６は、検索の最先端上の頂点を表し、ブロック４０８、４１０、および４１２は、非最先端の頂点を表す。
【００３４】
図示する例では、「ＩＤ∈［４ｋ、４ｋ＋３］」を有するいずれかの頂点が、検索の最先端上に存在する場合、およびその場合に限って、システム１００は、ビットマスクの「ｋ」番目のビット（例えば、このブロックは空ではない）を設定する。これらのビットが０番から７番の番号を付けられた８個のプロセッサに対応する場合、それぞれのビットは、連続したＩＤを有する４つの頂点の処理を担当し、ビットマスク４００内の「ｋ」番目のビットが設定されていなければ、「ｋ」番目のプロセッサに関する、処理を行うための頂点は存在しない。例えば、ビット４１４、４１６、４１８、および４２０により示されるように、プロセッサ０、２、３、６はそれぞれ、最先端の頂点を含む頂点の部分範囲を処理する。しかし、プロセッサ１、４、５、および７に関しては、処理する最先端の頂点は存在しない。これは、検索の最終結果に影響を及ぼすことなく、いくつかのアイドル頂点を素早くスキップする標準的技術であるが、２部グラフに適用されると、システム１００が頂点からプロセッサへの静的マッピングを適用した場合、この技術における上記に記載した全ての短所が露呈してしまう。
【００３５】
２部グラフだけでなく、非２部グラフも処理するよう設計された汎用のグラフ分析エンジン内で２部グラフを利用する、特別な論理回路を供給することが課題と言えよう。並列効率性のために、頂点の空間の特定の領域を安全に無視することができるよう、あるアプローチでは、ビットマップマスクを用いて、例えば、現在の探査ステップで処理される必要がある頂点などの最先端の頂点の存在（または不在）の概略を描き出している。
【００３６】
図５には、例示的な２部グラフの検索の最先端５００、およびそれに対応する静的なビットマスク５０１のブロック図が示されている。図５に関して、対応するグラフは、２部グラフであり、頂点＃０〜＃２３∈「Ｕ」（例えば、ブランクのブロック）、および頂点＃２４〜＃３１∈「Ｖ」（例えば、網掛けされたブロック）を有する。頂点＃０〜＃２３を表すブランクのブロックの例には、ブロック５０２、５０４、および５０６が含まれる。頂点＃２４〜＃３１を表す網掛けされたブロックの例には、ブロック５０８、５１０、および５１２が含まれる。
【００３７】
全ての８個の頂点∈「Ｖ」が最先端上に存在する「Ｖ」→「Ｕ」の探査ステップでは、システム１００は、８個のうち最後の２個のプロセッサしか使用することができない、というのも、その他の最初の６個のプロセッサは、全ての「Ｖ」→「Ｕ」の探査ステップにおいて、アイドル頂点であることが保証されている２４個の頂点∈Ｕの処理専用として静的に割り振られているからである。したがって、最良のケースでの並列効率性は、たった「２／８＝２５％」である。この例では、「｜Ｕ｜／｜Ｖ｜＝２４／８＝３」のため、図２によると、同じ２５％の並列効率性を、図２に示された「Ｖ」→「Ｕ」の効率性曲線上で見つけることができる。これは驚くべき結果ではない、というもの、静的な頂点−プロセッサのマッピングは、２部グラフ上の並列検索に関連する、全ての上述の問題を受け継いでいるに違いないからである。
【００３８】
単一方向の探査ステップにおいて全てのプロセッサの利用を容易にするために、本開示では、グラフ探査の方向に基づいて、頂点とプロセッサの間の相性をその場で調整する動的な頂点−プロセッサのマッピング方式を下記に説明する。「Ｐ」を並列検索に関して使用可能なプロセッサの数とする。説明を容易にするために、各頂点が整数ＩＤを有するものとする。「ｕｍｉｎ」および「ｕｍａｘ」を頂点∈「Ｕ」に関する、最小整数ＩＤおよび最大整数ＩＤとし、「ｖｍｉｎ」および「ｖｍａｘ」を頂点∈「Ｖ」に関する、最小整数ＩＤおよび最大整数ＩＤとする。互いに素な頂点ＩＤの範囲を有する、２つの区画「Ｕ」および「Ｖ」を含む２部グラフに関して、次の２つの不等式の関係のうちの一方を保持していなければならない。
・「ｕｍｉｎ≦ｕｍａｘ＜ｖｍｉｎ≦ｖｍａｘ」または
・「ｖｍｉｎ≦ｖｍａｘ＜ｕｍｉｎ≦ｕｍａｘ」
【００３９】
２部グラフにおいて、「Ｕ」→「Ｖ」の探査、および「Ｖ」→「Ｕ」の探査の２種類の基本探査ステップだけが存在する。前者の場合、全ての源点は「∈Ｕ」であり、全ての終点は「∈Ｖ」、一方「Ｖ」→「Ｕ」の探査ではその反対である。以下に、これらの２つケースについて別々に議論する。
【００４０】
「Ｕ」→「Ｖ」の探査のケース
「Ｕｍｉｎ」を以下のように（Ｐ＋１）個の要素の整数アレイとすると：
・Ｕｍｉｎ［０］＝ｕｍｉｎ
・Ｕｍｉｎ［ｐ］＜Ｕｍｉｎ［ｐ＋１］、（なお、「ｐ」＝０，１，…，（Ｐ−１））
・Ｕｍｉｎ［Ｐ］＝ｕｍａｘ＋１
「Ｕｍｉｎ」を用いて、下記の不等式が成り立つように、全体の頂点の集合∈「Ｕ」を「Ｐ」個の互いに素な部分集合に分割することができる。
Ｕｐ＝｛ｕ｜「ｕ∈Ｕ」∧Ｕｍｉｎ［ｐ］≦ＩＤ（ｕ）＜Ｕｍｉｎ［ｐ＋１］｝（なお、「ｐ」＝０，１，…，（Ｐ−１））
【００４１】
ＩＤ（ｕ）は、「ｕｍｉｎ」と「ｕｍａｘ」の間の頂点「ｕ」のＩＤを返す関数である。なお、「Ｕｐ」は、「Ｕ」→「Ｖ」の探査ステップで、システム１００がおそらくプロセッサ「ｐ」に割り当てることができる、最も大きな頂点の部分集合∈「Ｕ」である。「Ｕ＊ｐ」をプロセッサ「ｐ」に関する「Ｕ」→「Ｖ」の最先端の頂点の集合とすると、
Ｕ＊ｐ＝｛ｕ｜ｕ∈Ｕｐ∧ｆｒｏｎｔｉｅｒ（ｕ）＝ｔｒｕｅ｝となる。
なお、関数「ｆｒｏｎｔｉｅｒ（ｕ）」は、頂点「ｕ」が「Ｕ」→「Ｖ」の検索の最先端上に存在する場合、およびその場合に限って「ｔｒｕｅ」を返すブール関数である。「ＭＵ」を「ＭＵ［ｐ］」のような、「Ｐ」ビットのビットマスクとすると、「ｐ」番目のビットの値は、
【数４】
2015076093.tif 000006
となる。
【００４２】
「ＭＵ［ｐ］＝０」の場合、明らかにプロセッサ「ｐ」には、「Ｕ」→「Ｖ」の探査ステップで処理する最先端の頂点がなく、したがって、システム１００は、そのプロセッサ「ｐ」を安全にスキップすることができる。その一方で、「ＭＵ［ｐ］＝１」の場合、プロセッサ「ｐ」が処理するための少なくとも１つの最先端の頂点「ｕ∈Ｕ」が存在するが、「｜Ｕ＊ｐ｜≦｜Ｕ＊ｐ｜」のため、最悪の場合でも「｜Ｕ＊ｐ｜」個の頂点と同じ数だけ存在することを意味する。
【００４３】
「Ｖ」→「Ｕ」の探査のケース
「Ｖｍｉｎ」を下記のような（Ｐ＋１）個の要素の整数アレイとする。
・Ｖｍｉｎ［０］＝ｖｍｉｎ
・Ｖｍｉｎ［ｐ］＜Ｖｍｉｎ［ｐ＋１］，（なお、「ｐ」＝０，１，…，（Ｐ−１））
・Ｖｍｉｎ［Ｐ］＝ｖｍａｘ＋１
【００４４】
下記のように、全体の頂点の集合∈「Ｖ」を「Ｐ」個の互いに素な部分集合に分割する。
Ｖｐ＝｛ｖ｜ｖ∈Ｖ∧Ｖｍｉｎ［ｐ］≦ＩＤ（ｖ）＜Ｖｍｉｎ［ｐ＋１］｝（なお、「ｐ」＝０，１，…，（Ｐ−１））
「ＩＤ（ｖ）」は、「ｖｍｉｎ」と「ｖｍａｘ」の間の頂点「ｖ」のＩＤを返す関数である。「Ｖｐ」は、「Ｖ」→「Ｕ」の探査ステップにおいて、システム１００がおそらくプロセッサ「ｐ」に割り当てることができるであろう、最も大きな頂点の部分集合∈「Ｖ」である。「Ｖ＊ｐ」をプロセッサ「ｐ」に関する「Ｖ」→「Ｕ」最先端の頂点の集合とすると、
Ｖ＊ｐ＝｛ｖ｜「ｖ∈Ｖ」ｐ∧ｆｒｏｎｔｉｅｒ（ｖ）＝ｔｒｕｅ｝となる。
頂点「ｖ」が「Ｖ」→「Ｕ」検索の最先端上に存在する場合、およびその場合に限って、関数「ｆｒｏｎｔｉｅｒ（ｖ）」は「ｔｒｕｅ」を返す。
【００４５】
下記のように「ＭＶ」を「Ｐ」ビットのビットマスクとすると：
「ｐ」番目のビットの値である「ＭＶ［ｐ］」が、
【数５】
2015076093.tif 000007
であり、
【数６】
2015076093.tif 000008
である。
【００４６】
「ＭＶ［ｐ］＝０」は、そのプロセッサ「ｐ」には演算する最先端の頂点がないことを示す。「ＭＶ［ｐ］＝１」は、プロセッサ「ｐ」が処理するための少なくとも１つの最先端の頂点ｖ∈Ｖ」が存在することを示唆する（「｜Ｖ＊ｐ｜≦｜Ｖｐ｜」のため最悪の場合でも「｜Ｖｐ｜」の頂点と同じ数、存在し得る）。
【００４７】
ビットマスク「ＭＵ」および「ＭＶ」を用いて、動的なビットマスクＭを
・「Ｕ」→「Ｖ」の探査において「Ｍ」＝「ＭＵ」
・「Ｖ」→「Ｕ」の探査において「Ｍ」＝「ＭＶ」
として正式に定義することができる。
【００４８】
効率的な実装形態のために、システム１００は、ビットマスク「ＭＵ」および「ＭＶ」を、「Ｐ」ビットを有する同じビットマップアレイ内に以下の条件で格納することができる。（ａ）反対方向の探査が同時に実行されない。（ｂ）同じ方向の複数の探査があれば、互いに互換性がある（例えば、並列検索において同じビットマスク「ＭＵ」または「ＭＶ」を用いることができる）。
【００４９】
同様に「Ｕ＊ｐ」および「Ｖ＊ｐ」を用いることにより、プロセッサ「ｐ」に関する仕事量の頂点の集合である「Ｗ＊ｐ」を次の通り規定することができる。
・「Ｕ」→「Ｖ」の探査では「Ｗ＊ｐ＝Ｕ＊ｐ」
・「Ｖ」→「Ｕ」の探査では、Ｗ＊ｐ＝Ｖ＊ｐ」
【００５０】
このマッピングはグラフ探査の方向で変化するため、上記の頂点−プロセッサのマッピング方式は動的である。
【００５１】
整数アレイの「Ｕｍｉｎ」および「Ｖｍｉｎ」
整数アレイの「Ｕｍｉｎ」および「Ｖｍｉｎ」を設ける目的は、頂点ＩＤの範囲［ｕｍｉｎ，ｕｍａｘ］および［ｖｍｉｎ，ｖｍａｘ］をＰ個の互いに素な部分範囲に分割することである。例えば、範囲［ｕｍｉｎ，ｕｍａｘ］を分割する１つの方法として、Ｐ個のほぼ同じサイズの部分範囲に分割し、最初の（Ｐ−１）個の部分範囲を全く同じサイズ
【数７】
2015076093.tif 000009
に分割し、最後の区画に残りの頂点∈Ｕを含ませる。
つまり、
【数８】
2015076093.tif 000010
とする。
【００５２】
上記の分割スキームを均一頂点分布法と呼ぶ。但し、
【数９】
2015076093.tif 000011
は最初の（Ｐ−１）個の部分範囲の頂点サイズが最悪のケースにだけ当てはまり、検索の最先端上の頂点の実際の数は、ある探査ステップと別の探査ステップとで変わり得る。他にも「ｖｍｉｎ」と「ｖｍａｘ」の間の範囲を分割する方法が存在し、これらの範囲には非均一な最悪のケースの頂点サイズを有する区画が含まれる。例えば、１つの可能性として、実際の最先端サイズを全ての部分範囲に渡ってほぼ同じにして、負荷分散を改善するために非均一なサイズを許容する例が挙げられる。頂点から部分範囲へのマッピングが決定性ならば（例えば、単一の最先端の頂点が１つの部分範囲にきっちりとマッピングされる。）、その他の変形例も可能である。
【００５３】
動的な頂点−プロセッサのマッピングの例
以下の図６および図７の２つの例では、どのように動的マッピング方式が並列の効率性を向上させるかについて説明している。一方の例は「Ｕ」→「Ｖ」の探査のケースであり、他方の例は「Ｖ」→「Ｕ」の探査のケースである。
【００５４】
図６には、一実施形態に従った、例示的な「Ｕ」→「Ｖ」の検索の最先端６００、およびそれに対応する動的なビットマスク６０１が示されている。図６には、図５と同じ２部グラフが示されているが、この２部グラフでは、最初の６個だけではなく、全てのプロセッサを稼働状態に維持する、動的な頂点−プロセッサのマッピングが行われている。網掛けされているブロックは、最先端の頂点∈「Ｕ」に対応するブロックである。最先端の頂点∈「Ｕ」に対応するブロックの例には、ブロック６０２、６０４、および６０６が含まれる。全ての「Ｕ」→「Ｖ」の探査ステップでは、頂点∈「Ｖ」は、間違いなくアイドル頂点なので、頂点∈「Ｖ」に対応するブロックは全て、空ブロックとして示されている（ブロックが探査の非対象であることを示すために）。頂点∈「Ｖ」に対応するブロックの例として、ブロック６０８、６１０、および６１２が含まれる。
【００５５】
２４個の最先端の頂点、および「Ｐ＝８」が存在するため、「ｕｍｉｎ＝０」、「ｕｍａｘ＝２３」、および
【数１０】
2015076093.tif 000012
である。均一頂点分布法スキームもとでは、「Ｕｍｉｎ＝｛０，３，６，…，２４｝」かつ「Ｕ＊ｐ＝Ｕｐ＝｛ｕ｜３ｐ≦ＩＤ（ｕ）＜３ｐ＋３｝（なお、ｐ＝０，１，…，７）」である。すなわち、システム１００は、各プロセッサ「ｐ」を［３ｐ，３ｐ＋３）の範囲におけるＩＤを有する３つの頂点に割り当てる。これが、プロセッサの利用率が１００％の最適な頂点−プロセッサの割り当て方式である。比較に関しては、静的なマッピング方式では、７５％のプロセッサ利用率を達成している。
【００５６】
なお、頂点∈「Ｕ」が頂点∈「Ｖ」と混ざり合わないように、異なる頂点の種類に関する頂点識別子（ＩＤ）の範囲は互いに素とする。効率性を高くするために、同じ種類の頂点が連続したＩＤを持つものとするが、このことは厳しく要求されているわけではない。
【００５７】
図７には、一実施形態に従った、例示的な「Ｖ」→「Ｕ」の検索の最先端７０２、およびそれに対応する動的なビットマスク７０４が示されている。「Ｖ」→「Ｕ」の探査に関して、図７には、図５と同じ２部グラフが示されているが、この２部グラフでは、図５に示される通り、最後の２個のプロセッサだけではなく、全ての８個のプロセッサを稼働状態に維持する、動的な頂点−プロセッサのマッピングが行われる。最先端の頂点∈「Ｖ」に対応するブロックは網掛けされて示され、これらのブロックには、例えば、ブロック７０６および７０８が含まれる。全ての「Ｖ」→「Ｕ」の探査ステップでは、頂点∈集合「Ｕ」は、間違いなくアイドル状態であるため、図７では、頂点∈「Ｕ」に対応するブロックが空ブロックとして示され、これらのブロックには、例えば、ブロック７１０、７１２、７１４、および７１６が含まれる。８個の最先端の頂点、および「Ｐ＝８」が存在するため、プロセッサごとの頂点の数を、次の通り演算することができる。「ｖｍｉｎ＝２４」、「ｖｍａｘ＝３１」，および
【数１１】
2015076093.tif 000013
均一な頂点分布スキームのもとでは、「Ｖｍｉｎ＝｛２４，２５，２６，…，３２｝」かつ「Ｖ＊ｐ＝Ｖｐ＝｛ｖ｜ＩＤ（ｖ）＝２４＋ｐ｝（ｐ＝０，１，…，７）」である。すなわち、システム１００は、各プロセッサ「ｐ」を（２４＋ｐ）個のＩＤを有する単一の頂点に割り当てる。これがプロセッサの利用率が１００％の最適な頂点−プロセッサの割り当て方式である。例えば、システム１００は、最先端の頂点７０６および７０８を、それぞれプロセッサ７１８および７２０に割り当てる。ちなみに、静的マッピング方式では、たった２５％のプロセッサ利用率しか達成しない。
【００５８】
一般グラフ上の動的マッピング
本明細書で開示される動的マッピング方式は、２部グラフに限定されない。以下に、準２部グラフを含む一般グラフ上の並列検索の速度を上げることが可能な、効率的な一般化について説明する。２部グラフ内の頂点と区別するために、一般グラフ内の頂点、およびその頂点の集合は、符号「ｎ」および「Ｎ」で示す。「Ｎｓｒｃ」を源点、例えば、一般グラフ内の全ての頂点∈Ｎの中で少なくとも１つの後方頂点を有する源点の集合とする。「ｎｍｉｎ−ｓｒｃ」および「ｎｍａｘ−ｓｒｃ」は、それぞれ「Ｎｓｒｃ」の最小整数識別子および最大整数識別子である。「Ｎｍｉｎ−ｓｒｃ」を下記のような（Ｐ＋１）個の要素の整数アレイとする。
・Ｎｍｉｎ−ｓｒｃ［０］＝ｎｍｉｎ−ｓｒｃ
・Ｎｍｉｎ−ｓｒｃ［ｐ］＜Ｎｍｉｎ−ｓｒｃ［ｐ＋１］，（なお、「ｐ」＝０，１，…，（Ｐ−１））
・Ｎｍｉｎ−ｓｒｃ［Ｐ］＝ｎｍａｘ−ｓｒｃ＋１
【００５９】
「Ｎｍｉｎ−ｓｒｃ」を用いて、システム１００は、全体の源点の集合「Ｎｓｒｃ」を、下記のように、Ｐ個の互いに素な部分集合に分割することができる。
Ｓｐ＝｛ｎ｜ｎ∈Ｎｓｒｃ∧Ｎｍｉｎ−ｓｒｃ［ｐ］≦ＩＤ（ｎ）＜Ｎｍｉｎ−ｓｒｃ［ｐ＋１］｝，（なお、「ｐ」＝０，１，…，（Ｐ−１））
【００６０】
「Ｓ＊ｐ」をプロセッサ「ｐ」に関する最先端の頂点の集合とすると：
Ｓ＊ｐ＝｛ｎ｜ｎ∈Ｓｐ∧ｆｒｏｎｔｉｅｒ（ｎ）＝ｔｒｕｅ｝となる。
【００６１】
「ｐ」番目のビットの値であるＭＳ［ｐ］が下記の値となるように「ＭＳ」を「Ｐ」ビットのビットマスクにすると、
【数１２】
2015076093.tif 000014
であり、
【数１３】
2015076093.tif 000015
である。
【００６２】
「ＭＳ［ｐ］＝０」とは、プロセッサ「ｐ」には、演算すべき最先端の頂点がないことを意味する。「ＭＳ［ｐ］＝１」は最悪のケースでも「｜Ｓｐ｜」の頂点と同じ数の頂点があり得るが、プロセッサ「ｐ」が処理する少なくとも１つの最先端の頂点が存在することを示唆している。
【００６３】
なぜ上記の式が一般化なのかを確認するために、「Ｍｓ」と、２部グラフに関して規定された動的ビットマスク「Ｍ」との関係を検査することができる。上記に記載した通り、「Ｕ」→「Ｖ」の探査では「Ｍ＝ＭＵ」であり、「Ｖ」→「Ｕ」の探査では「Ｍ＝ＭＶ」である。「Ｕ」→「Ｖ」の探査に関して、源点の集合は「Ｕ」であり、「∀ｐ」、「Ｕｐ＝Ｓｐ」および「Ｕ＊ｐ＝Ｓ＊ｐ」である。したがって、「Ｕ」→「Ｖ」の探査では、「ＭＵ＝ＭＳ」となる。「Ｖ」→「Ｕ」の探査に関して、源点の集合は「Ｖ」であり、「∀ｐ」、「Ｖｐ＝Ｓｐ」および「Ｖ＊ｐ＝Ｓ＊ｐ」である。したがって、「Ｖ」→「Ｕ」の探査では、「ＭＶ＝ＭＳ」となる。両方の場合において、「Ｍ＝ＭＳ」であり、したがって、これら二つは、２部グラフにおいて等価である。全ての探査ステップにおける源点の集合が、いつでもよく定義されているため、「ＭＳ」は一般グラフに適用可能であるが、「Ｍ」（「ＭＵ」または「ＭＶ」）は適用可能ではない、というのも、このＭは、２部グラフ内でのみ見つけ出すことができる「Ｕ」頂点および「Ｖ」頂点の概念に基づくためである。
【００６４】
図８には、一実施形態に従った、「Ｕ」→「Ｖ」の探査に関して、頂点をプロセッサに動的に割り当てるための例示的な処理のフローチャートが示されている。動作中、システム１００はグラフの辺と頂点を規定する入力情報を受信する（動作８０２）。システム１００は、ユーザ入力を通して、または前もって格納されたグラフデータとして、あるいはその他のあらゆる方法を通して、グラフデータを受信することができる。次に、システム１００は、プロセッサの数を決定する（動作８０４）。例えば、システム１００は、５０個のプロセッサに関して「Ｐ＝５０」と決定することができる。但し、システム１００が頂点をプロセッサに割り当てるとき、システム１００は、毎回、ステップ８０２およびステップ８０４を実行する必要はない。実装形態によっては、グラフごとに一度、およびグラフの変更に関する付加的なデータを続いて受信したときに、システム１００が、ステップ８０２およびステップ８０４を実行することができる。
【００６５】
システム１００が「Ｕ」→「Ｖ」の探査ステップを実行するとき、システム１００は、頂点「Ｕ」の集合内の頂点を動的に決定して各プロセッサに割り当てる。最初に、システム１００は、頂点「Ｕ」の集合を「ｐ」個の互いに素な部分集合「Ｕｐ」に分割し、これらの各部分集合「Ｕｐ」は、各プロセッサ「ｐ」と関連する（動作８０６）。次に、システム１００は、プロセッサ「ｐ」に関する最先端の頂点の集合である「Ｕ＊ｐ」を決定する（動作８０８）。次いで、システム１００は、
【数１４】
2015076093.tif 000016
の場合にはｐ番目のビットの値である「ＭＵ［ｐ］」が「１」となるよう、「ｐ」ビットのビットマスクである「ＭＵ」を決定し、
【数１５】
2015076093.tif 000017
の場合にはｐ番目のビットの値が「０」となるように、「ｐ」ビットのビットマスクである「ＭＵ」を決定する（動作８１０）。次いで、システム１００は、「ＭＵ［ｐ］」＝「１」の場合の処理のために、最先端の頂点である「Ｕ＊ｐ」をプロセッサ「ｐ」に割り当てる（動作８１２）。なお、「ＭＵ［ｐ］＝０」の場合、これはプロセッサ「ｐ」が処理する最先端の頂点が存在しないことを意味し、実施形態によっては、システム１００が、他のプロセッサから、いくつかの処理を取り出し、プロセッサ「ｐ」に割り当てることができる。
【００６６】
図９には、一実施形態に従った、「Ｖ」→「Ｕ」の探査に関して、頂点をプロセッサに動的に割り当てるための例示的な処理を示すフローチャートが示されている。動作中、システム１００は、グラフの辺および頂点を規定する入力情報を受信する（動作９０２）。システム１００は、ユーザ入力を通して、または事前に格納されたグラフデータとして、あるいはその他のあらゆる方法を通して、グラフデータを取得することができる。次に、システム１００は、プロセッサの数を決定する（動作９０４）。例えば、システム１００は、５０個のプロセッサに関して「Ｐ＝５０」と決定することができる。但し、システム１００が頂点をプロセッサに割り当てるとき、システム１００は、毎回、ステップ９０２およびステップ９０４を実行する必要はない。実装形態によっては、グラフごとに一度、およびグラフの変更に関する付加的なデータを受信したときに、システム１００が、ステップ９０２およびステップ９０４を実行することができる。
【００６７】
システム１００が「Ｖ」→「Ｕ」の探査ステップを実行するとき、システム１００は、各プロセッサに割り当てる頂点「Ｖ」の集合内の頂点を動的に決定して各プロセッサに割り当てる。最初に、システム１００は、頂点「Ｖ」の集合を「ｐ」個の互いに素な部分集合「Ｖｐ」に分割し、これらの各部分集合「Ｖｐ」は、各プロセッサ「ｐ」と関連する（動作９０６）。次に、システム１００は、プロセッサ「ｐ」に関する最先端の頂点の集合である「Ｖ＊ｐ」を決定する（動作９０８）。次いで、システム１００は、
【数１６】
2015076093.tif 000018
の場合にはｐ番目のビットの値であるＭＶ［ｐ］が「１」となるよう、「ｐ」ビットのビットマスクである「ＭＶ」を決定し、
【数１７】
2015076093.tif 000019
の場合にはｐ番目のビットの値が「０」となるように、「ｐ」ビットのビットマスクである「ＭＶ」を決定する（動作９１０）。次いで、システム１００は、「ＭＶ［ｐ］＝１」の場合の処理のために、最先端の頂点「Ｖ＊ｐ」をプロセッサ「ｐ」に割り当てる（動作９１２）。なお、「ＭＶ［ｐ］＝０」の場合、これはプロセッサ「ｐ」が処理する最先端の頂点が存在しないことを意味し、実施形態によっては、システム１００は、他のプロセッサから、いくつかの処理を取り出し、プロセッサ「ｐ」に割り当てることができる。
【００６８】
図１０には、一実施形態に従った、一般グラフにおける源点から終点への探査に関して、頂点をプロセッサに動的に割り当てる例示的な処理のフローチャートが示されている。動作中、システム１００は、グラフの辺と頂点を規定する入力情報を受信する（動作１００２）。システム１００は、ユーザ入力を通して、または事前に格納されたグラフデータとして、あるいはその他のあらゆる方法を通して、グラフデータを受信することができる。次に、システム１００はプロセッサの数を決定する（動作１００４）。例えば、システム１００は、５０個のプロセッサに関して「Ｐ＝５０」と決定することができる。但し、システム１００が頂点をプロセッサに割り当てるとき、システム１００は、毎回、ステップ１００２およびステップ１００４を実行する必要はない。実装形態によっては、グラフごとに一度、およびグラフの変更に関するデータを続いて受信したときに、システム１００は、ステップ１００２およびステップ１００４を実行することができる。
【００６９】
システム１００が源点から終点への探査ステップを実行するとき、システム１００は、各プロセッサに割り当てる、源点「Ｎｓｒｃ」の集合内の頂点を動的に決定して各プロセッサに割り当てる。最初に、システム１００は、源点「Ｎｓｒｃ」の集合を、「Ｐ」個の互いに素な部分集合「Ｓｐ」に分割し、各部分集合「Ｓｐ」は各プロセッサ「ｐ」と関連する（動作１００６）。次に、システム１００は、プロセッサ「ｐ」に関する最先端の頂点の集合「Ｓ＊ｐ」を決定する（動作１００８）。次いで、システム１００は、
【数１８】
2015076093.tif 000020
の場合には「ＭＳ［ｐ］」（ｐ番目のビットの値）が「１」となるよう、「ｐ」ビットのビットマスクである「ＭＳ」を決定し、
【数１９】
2015076093.tif 000021
の場合にはｐ番目のビットの値が「０」となるように、「ｐ」ビットのビットマスクである「ＭＳ」を決定する（動作１０１０）。次いで、システム１００は、「ＭＳ［ｐ］」＝「１」の場合の処理のために、最先端の頂点「Ｓ＊ｐ」をプロセッサ「ｐ」に割り当てる（動作１０１２）。なお、「Ｍｓ［ｐ］＝０」の場合、これはプロセッサ「ｐ」が処理する最先端の頂点が存在しないことを意味し、実施形態によっては、システム１００が、他のプロセッサから、いくつかの処理を取り出し、プロセッサ「ｐ」に割り当てることができる。
【００７０】
図１１には、一実施形態に従った、グラフ探査に関して開示されたプロセッサの使用技術を用いた、商品に関する推奨を生成するための例示的な処理のフローチャートが示されている。この処理により、システム１００は、プロセッサリソースを効率的に用いて、同じ商品を同様に購入した他の人達が、購入したその他の商品を、商品を購入したユーザに推奨することができる。
【００７１】
動作中、システム１００は、最初に、顧客−商品のグラフの頂点と辺を示すグラフデータを受信する（動作１１０２）。頂点は顧客と商品を表し、辺は購買行動を表す。そのようなグラフは、顧客が頂点の一つの集合として表され、商品が頂点の別の集合として表された、２部グラフでよい。次に、システム１００は、顧客を表す頂点をプロセッサの集合に割り当てることができる（動作１１０４）。システム１００は、図８に示された方法のいくつかのステップを実行して、顧客の頂点をプロセッサに動的に割り当てることができる（例えば、動作８０４から動作８１２）。システム１００は、顧客を表す頂点の集合から購入された商品を表す頂点の集合へのグラフの探査を行う（動作１１０６）。次いで、システム１００は、購入された商品を表す頂点をプロセッサの集合に割り当てる（動作１１０８）。システム１００は、図９に示された方法のいくつかのステップを実行して、商品の頂点をプロセッサに動的に割り当てることができる（例えば、動作９０４から動作９１２）。
【００７２】
ある実施形態では、システム１００は、頂点を全ての使用可能なプロセッサに動的に割り当てる。したがって、プロセッサのある集合は、ある時は顧客を表す頂点を処理することができ、また別の時は商品を表す頂点を処理することができる。同じプロセッサの集合が、顧客の頂点と商品の頂点の両方を処理することが可能である。但し、一般に、動的マッピングを行う状況では、探査されるグラフは、探査方向には関係なく、同じものとする。２つのグラフが同じであるかどうかをテストする課題については、２０１３年９月２７日出願の、発明者Ｒｏｎｇ  Ｚｈｏｕ  および  Ｄａｎｉｅｌ  Ｄａｖｉｅｓによる「Ｓｙｓｔｅｍ  ａｎｄ  Ｍｅｔｈｏｄ  ｆｏｒ  ａ  Ｈｉｇｈ−Ｐｅｒｆｏｒｍａｎｃｅ  Ｇｒａｐｈ  Ａｎａｌｙｔｉｃｓ  Ｅｎｇｉｎｅ」と題する、米国特許出願第１４／０３９，９４１号明細書（弁理士整理番号第ＰＡＲＣ−２０１３０１１８−ＵＰ−ＮＰ号明細書）で議論されており、この開示内容は参照することにより、本明細書に完全に組み込まれるものとする。
【００７３】
次に、システム１００は、購入された商品を表す頂点の集合から、その商品を同様に購入した顧客を表す頂点の集合へのグラフを探査する（動作１１１０）。次いで、システム１００は、その商品を同様に購入した顧客を表す頂点をプロセッサの集合に割り当てる（動作１１１２）。システム１００は、図８に示された方法のいくつかのステップ（例えば、動作８０４から動作８１２）を実行して、顧客の頂点をプロセッサに動的に割り当てることができる。但し、このステップでの、顧客の頂点のプロセッサへの割り当ては、以前、動作１１０４で行われた、顧客の頂点のプロセッサへの割り当てとは異なる可能性がある。システム１００は、その商品を同様に購入した顧客を表す頂点の集合から、推奨することができる商品を表す頂点の集合へのグラフの探査を行う（動作１１１４）。次いで、システム１００は、このグラフの探査および推奨可能な商品に基づいて、商品に関する推奨を生成する（動作１１１６）。システム１００は、標準的な方法を用いて、推奨可能な商品のセレクションを推奨するために選択することができる。例えば、所定の評価の閾値を超えた推奨可能な１つ以上の商品、または最も高い評価を得た推奨可能な１つ以上の商品を選択する。
【００７４】
図３に示される準２部グラフを用いて、非２部グラフに関する、開示された技術の一般性を説明することができる。図１Ａおよび図３の両方において、左側の上段から下段に、かつ右側の上段から下段に頂点「ＩＤ」が番号を付けられている、すなわち左側の上段（下段）の頂点が「０」（４）の「ＩＤ」を有し、右側の上段（下段）の頂点が「５」（８）の「ＩＤ」を有するものと仮定すると、下記には、最小源点「ＩＤ」および最大源点「ＩＤ」の統計値が示されている。
・左から右の探査（矢印の方向に沿った）
ｏ「ｎｍｉｎ−ｓｒｃ＝０」かつ「ｎｍａｘ−ｓｒｃ＝４」（図１Ａ）
ｏ「ｎｍｉｎ−ｓｒｃ＝０」かつ「ｎｍａｘ−ｓｒｃ＝４」（図３）
・右から左の探査（方向の矢印に逆らった）
ｏ「ｎｍｉｎ−ｓｒｃ＝５」かつ「ｎｍａｘ−ｓｒｃ＝８」（図１Ａ）
ｏ「ｎｍｉｎ−ｓｒｃ＝４」かつ「ｎｍａｘ−ｓｒｃ＝８」（図３）
【００７５】
図１Ａが２部グラフで、図３だけが準２グラフであったとしても、これらの２つのグラフは同様の構造を共有し、それに伴い、同様の統計値を共有する。これらのグラフは、「ｎｍｉｎ−ｓｒｃ」の統計値において、右から左の探査（例えば、図１Ａの「Ｖ」→「Ｕ」）に関して１つ（５対４）異なるだけであるため、本明細書に開示された技術を用いることにより、これらの２つのグラフの並列検索の効率性を比較できるはずである。左から右の探査に関して、２つのグラフは全く同じ統計値を有する。したがって、同じ頂点−プロセッサのマッピングとなり、これにより、並列の効率性における、これらのグラフの違いが、あったとしても、より小さくなる。開示された技術は、きっちりとした２部グラフである必要がないため、コンピュータ的にコストがかかる、グラフの２部グラフ性に関する確認の必要はない。
【００７６】
但し、中には動的マッピングの技術が、一般グラフで単独では、著しく速度を増加させない場合もある。例えば、図３に頂点「０」（上段の左）から頂点「１」（上段から２番目の左）の辺が存在する場合、「ｎｍｉｎ−ｓｒｃ」の統計値は、右から左の探査に関して「１」となり、これにより並列の効率性は低下する可能性がある。統計値「ｎｍｉｎ−ｓｒｃ」および「ｎｍａｘ−ｓｒｃ」がグラフの２部に背く辺により著しい影響を受けないよう頂点の「ＩＤ」を並び変えることができる場合、一般グラフ上での動的なマッピングの効率性を向上させることが可能である。いつもの通り、２部グラフ上では動的なマッピングの並列の効率性は、頂点がどのように番号を付けられているかにかかわらず保証される。動的なマッピングのオーバヘッドはごくわずかものであるため、動的なマッピングが特定の一般グラフ上であまり効果的でないときであっても、この動的なマッピングを実行することにつては、通常、損害はない。
【００７７】
ここまで本開示では、効率的なグラフ探査のためにシステム内で実施可能な、動的な頂点−プロセッサのマッピング方式について説明してきた。しかし、動的なマッピング方式を汎用のグラフ分析エンジンと統合する際に未だに課題が存在し得る。つなぎ目のない統合を容易にするための基本ステップについて以下に説明する。
【００７８】
システム１００は、グラフに各探査方向で、それらのグラフ統計値「ｎｍｉｎ−ｓｒｃ」および「ｎｍａｘ−ｓｒｃ」の注釈を付ける。システム１００は、グラフ読取り関数を用いてこれを実現し、このグラフ読取り関数は、グラフが最初に読み込まれるとき、非分離頂点に関する最小「ＩＤ」および最大「ＩＤ」を記録する。システム１００が、グラフを動的に修正することができる場合、グラフが変化するときにそれに応じて、システム１００は、それらの統計値を更新する必要がある。これらの統計値の記録は簡単であるため、これによりほとんどエンジンにはオーバヘッドが加わらない。
【００７９】
頂点−プロセッサのマッピング関数は、頂点「ＩＤ」の全範囲（例えば、［０，ｎｍａｘ］または［ｎｍｉｎ，ｎｍａｘ］）の代わりに、範囲［ｎｍｉｎ−ｓｒｃ，ｎｍａｘ−ｓｒｃ］を分割し、この後、この部分範囲内の頂点をプロセッサまたは並列検索に関するスレッドに割り当てる。
【００８０】
それらの最先端の頂点を効率的に見つけ出すために（例えば、全ての頂点を明示的に列挙することなしに）、グラフ分析エンジンはビットマスク（例えば、ＭＳと同様の）を用いることができ、このビットマスクが部分範囲ごとにフラグを維持する。システム１００は、部分範囲のフラグを設定して、その部分範囲が次の探査ステップ（すなわち、最も近い将来）に関する１つ以上の最先端の頂点を含むようにする（現在の探査ステップに関して規定される「ＭＳ」とは異なり）。システム１００は、現在の探査ステップにおいて、これらの「ｓｕｂｒａｎｇｅ−ｈａｓ−ｆｒｏｎｔｉｅｒ−ｖｅｒｔｅｘ」フラグを更新するが、このことは、次の探査ステップのための演算を節約することを意図し、これにより、これらのフラグが設定されていない部分範囲を安全にスキップすることができる。
【００８１】
汎用のグラフ分析エンジンでは、探査ベースの演算はその他の非探査ベースの演算と共存する必要があり得る。したがって、このようなデータ構造が探査ベースの演算と非探査ベースの演算の間で共有される場合は特に、そのエンジンが、種々のビットマスク（例えば、ＭＳ）およびフラグ（例えば、「ｓｕｂｒａｎｇｅ−ｈａｓ−ｆｒｏｎｔｉｅｒ−ｖｅｒｔｅｘ」フラグ）を適切に用いているか（例えば、初期化されたか、アクセスされたか、および破壊されたか）を確認しなければならない。例えば、現在の「ｓｕｂｒａｎｇｅ−ｈａｓ−ｆｒｏｎｔｉｅｒ−ｖｅｒｔｅｘ」フラグを潜在的に無効とし得る非探査ステップにより、２つの探査ステップが分離された場合、そのエンジンが安全な場所でエラーを起こし、演算の正確さのためにそのようなフラグを無視するものとする。
【００８２】
動的なマッピングは、２部グラフおよび特定の準２部グラフ上で１００％に近い並列効率性を実現することができるが、対照的に、静的なマッピングでは効率性が低い。探査方向および２つの区画サイズの割合によって、静的なマッピングは２部グラフ上の並列検索に関する動的なマッピングよりも随意的に悪くなる可能性がある。開示されている技術の実際の利益を評価するために、発明者らは、小売業の実在のデータセットを用いて次の実験を行った。
【００８３】
この実験では、次の形態の顧客の購買データに基づくグラフが用いられた。＜顧客＿ｉｄ＞＜商品＿ｉｄ＞、なお、＜顧客＿ｉｄ＞を有する顧客が、＜商品＿ｉｄ＞を有する商品を購入する。上記に記載した通り、「ｃｕｓｔｏｍｅｒ−ｂｏｕｇｈｔ−ｐｒｏｄｕｃｔ」グラフは、顧客の頂点と商品の頂点の間にのみ辺が存在することができる２部グラフである。このベンチマークのクエリは、上記に記載したのと同じ協調フィルタである（便宜上、下記に再度記述する）。
１．顧客の頂点からスタートし、その顧客により購入された商品の集合を見つけ出す。
２．これらの商品のうちの少なくとも１つを購入した他の顧客を見つけ出す。
３．これらの顧客により購入された最も人気のある商品を見つけ出す。
発明者らは、以下の理由から、上記の協調フィルタのクエリを選んで開示されている技術の並列効率性の基準を定めた。第１に、このクエリは「Ｕ」→「Ｖ」の探査（ステップ１での顧客→商品）、および「Ｖ」→「Ｕ」の探査（ステップ２での商品→顧客）の両方を必要とする。第２に、このクエリは、様々な商品が購入された回数の記録を担うカウンタを初期化するなど、いくつかの非グラフベースの演算を含む。
【００８４】
さらに、この実装形態では、一般の商品の購入行動（例えば、閲覧された共通の商品）に加えて複数のフィルタ基準が使用可能なため、ステップ１の「シード」顧客になんらかの形で関連する顧客の集合を精製するため、ビットマップなどの付加的なデータ構造を用いる。多くの実在の分析問題がグラフベースの演算および非グラフベースの演算の両方を必要とするため、例えば、このエンジンの非グラフの様態を行う演算が、実験のアプリケーションの現実感を増す。実測秒の間、非グラフ演算がグラフベースの演算を支配することを避けるため、この実験では、システム１００が、結果を出力し、その結果をディスクに格納されたファイルに書き込む必要はなかった。しかし、発明者らはファイルに書き込まれる結果は、静的なマッピングおよび動な的マッピングの両方に関して全く同じであったろうということを検証した。
【００８５】
実験で使用されたグラフ「ｃｕｓｔｏｍｅｒ−ｂｏｕｇｈｔ−ｐｒｏｄｕｃｔ」は、一方の探査方向で約２４，４００，０００本の辺を有する。したがって、格納されている辺の総数は、両方向の探査に関して、約２４，４００，０００本×２＝４８，８００，０００本の辺となる。在庫管理ユニット（ＳＫＵ）のレベルで、４００，０００個を超える一意の商品に対して、約３，０００，０００人の一意の顧客が存在する。したがって、｜Ｕ｜と｜Ｖ｜の割合は約「７」または約「８」である。システム１００は、ステップ１で使用されたクエリとは、異なる「シード」として、１００人の顧客の集合をランダムに選び、平均実測秒を記録し、その平均実測秒を頂点からプロセッサへのマッピングの異なるアプローチ間で比較する。ベースラインとして、この実験には静的なマッピング実装形態も含まれ、この静的なマッピング実装形態は頂点の集合を互いに素な部分範囲に静的に分割し、並列検索を行うために、異なる部分範囲を異なるプロセッサに割り当てる。ベースラインの実装形態内の全てのスレッドが集団で頂点の全範囲を処理し、一方、新しい動的なマッピングのアプローチはその源点だけを処理する。実験では、４個のコアおよび８ＧＢのＲＡＭを有するＩｎｔｅｌ  Ｘｅｏｎ  Ｅ３−１２２５  ３．１ＧＨｚのプロセッサを搭載したテスト機を使用した。この実験では、ベースラインに関して、利用可能な最良の構成が用いられ、本開示により新しい並列の技術が可能となった。
【００８６】
１００人のランダムなシード顧客を処理する平均実測時間は、静的なマッピングに関して３６ミリ秒であり、動的なマッピングに関して１４ミリ秒であり、これはベースラインよりも約２．６倍速い。上記に記載した通り、ベンチマークにおけるメモリの初期化および顧客のフィルタリングを含む複数の演算ステップは、ベースラインと新しい技術の両方で共通である。したがって、動的なマッピングの相対的な速度の利点は、純粋なグラフの探査に関して、ここで報告したものよりも著しく大きなものになる可能性がある。さらに、このテスト機は、コアを４個しか備えておらず、最大並列の速度アップは４倍までに制限される。しかし、より多くのコアを用いることにより、動的なマッピング法について、さらに大きな速度の上昇が期待できる。
【００８７】
図１２には、一実施形態に従った、探査に関して最先端の頂点をプロセッサに動的に割り当てることを容易にする、例示的な装置１２００が示されている。装置１２００は、複数のモジュールを含むことができ、これらのモジュールは、有線または無線の通信チャネルを介して互いに通信可能である。装置１２００は、１つ以上の集積回路を用いて実現可能であり、図１２に示されるモジュールよりも少ない数、あるいは多い数のモジュールを含むことが可能である。さらに、装置１２００をコンピュータシステム内に組み込むことができる、あるいはその他のコンピュータシステムおよび／または装置と通信可能な別の装置として実現することもできる。具体的には、装置１２００は、グラフデータ受信モジュール１２０２、頂点分割モジュール１２０４、最先端頂点決定モジュール１２０６、およびビットマスク決定モジュール１２０８を含むことができる。
【００８８】
いくつかの実施形態では、グラフデータ受信モジュール１２０２は、グラフの頂点と辺を記述したデータを受信することができる。頂点分割モジュール１２０４は、本明細書に記載される技術を用いて、プロセッサ間の頂点を分割することができる。最先端頂点決定モジュール１２０６は、検索の最先端の一部である頂点を決定する。ビットマスク決定モジュール１２０８は、ビットマスクを決定する。なお、図１に示されるグラフ管理モジュール１０２は、図１２に示した種々のモジュールの全ての機能を提供することができる。
【００８９】
図１３には、一実施形態に従った、探査に関して頂点をプロセッサに動的に割り当てることを容易にする、例示的なコンピュータシステム１３００が示されている。ある実施形態では、コンピュータシステム１３００は、プロセッサ１３０２、メモリ１３０４、および  記憶装置１３０６を含む。記憶装置１３０６には、アプリケーション１３１０および１３１２などの複数のアプリケーション、およびオペレーティングシステム１３１６が格納される。記憶装置１３０６には、またグラフ演算システム１００も格納され、このグラフ演算システム１００が、グラフデータ受信モジュール１２０２、頂点分割モジュール１２０４、最先端頂点決定モジュール１２０６、およびビットマスク決定モジュール１２０８を含むことができる。記憶装置１３０６にはまた、グラフデータ１３３０も格納され得る。動作中、グラフ演算システム１００などの１つ以上のアプリケーションが、記憶装置１３０６からメモリ１３０４に読み込まれ、プロセッサ１３０２により実行される。プログラムを実行する間、プロセッサ１３０２は上述の関数を実行する。コンピュータおよび通信システム１３００は、随意的なディスプレイ１３１７、キーボード１３１８、およびポインティングデバイス１３２０と接続可能である。
【図１Ａ】
2015076093.tif 000024
【図１Ｂ】
2015076093.tif 000025
【図２】
2015076093.tif 000026
【図３】
2015076093.tif 000027
【図４】
2015076093.tif 000028
【図５】
2015076093.tif 000029
【図６】
2015076093.tif 000030
【図７】
2015076093.tif 000031
【図８】
2015076093.tif 000032
【図９】
2015076093.tif 000033
【図１０】
2015076093.tif 000034
【図１１】
2015076093.tif 000035
【図１２】
2015076093.tif 000036
【図１３】
2015076093.tif 000037