2

質問のために、数千の都市と、訪れた都市に関連する数百万の旅行者のネットがあるとしましょう。平均して、すべての旅行者は 50 の都市を訪れていますが、最大 1000 の極端なものもあります。

1) 最初の (単純な) 質問は、訪問した都市間の類似性に基づいて、特定の旅行者について最も類似した旅行者のリストを見つける方法です。つまり、これらの都市を訪れた 3 人の旅行者がいます。

A: シアトル(WA)、ボルチモア(MD)、ダラス(TX) B: ポートランド(OR)、DC、オースティン(TX) C: シアトル(WA)、ポートランド(OR)、DC、ボルチモア(MD)

ここで訪問した都市を比較すると、旅行者 A の場合、最も類似しているのは旅行者 C になります。

すべての旅行者にとって、出席した都市のサブネットは本質的に直接接続されたノードのリストであるため、Cypher がなくても比較は比較的簡単です (Cypher を介して行うエレガントな方法があるかどうかはわかりません)。

2) より複雑な比較シナリオは、直接の都市ではなく、それらの特性 (州、国、気候、人口、魅力の種類など) によるものです。この例では、すべての都市は、地域にリンクされている州にリンクされています。地域に基づいて A に最も類似した旅行者を探すと、旅行者 B が勝者になります (都市レベルでは一致するものはありません)。

両方の質問についてどう思いますか。

4

2 に答える 2

0

この問題に対するグラフ アプローチが本当に必要な場合は、都市のプロパティをノードとして持ち、都市をノードにリンクすることをお勧めします。

したがって、これらの行に沿って何かがあるでしょう:

(user)-[:visited]->(city)-[:has_property]->(property #i)

同じプロパティへのリンクの数によって、類似の都市を簡単に見つけることができます。

クエリは、暗号で実装できる基本的な推奨事項に過ぎず、これらの行に沿ったものがあります(テストされていませんが、アイデアを得る必要があります):

start A=node:users("")
match A-[:visited]->()-[:has_properties]->p
with distinct p as p
match p<-[r:has_properties]-cities
with distinct cities, count(r) as sim_score
order by sim_score desc limit 10
match cities<-[r:visited]-similar
return count(r) as score, similar
order by score desc limit 5

3 つのステップで機能します。

  • ユーザー A が訪れた都市のプロパティを取得する (「特徴抽出」部分)
  • 次に、機能から、最も類似した都市を取得します
  • 最後に、同じ「プロファイル」を持つ類似ユーザーを取得します

パフォーマンスの問題については、都市の類似性をオフラインで計算できます。これはあまり頻繁に変更すべきではないため、予測しにくいユーザーの類似性についてのみ「リアルタイム」に注目する必要があるためです。

また、サーバーに十分な RAM を配置することも忘れないでください ;)

于 2013-10-21T12:51:27.390 に答える