0

Cypher でユーザー アクティビティのサンプリングを実行するのに苦労しています。

私のグラフはどのように見えますか

グラフには、インデックス付きプロパティ UserId を持つ数百万のユーザー レコーダーがあります。

インデックス付きプロパティ ItemId を持つ数百の製品があります。

私のユーザーは、私の製品と [INTERACTS] することができます。

私がやろうとしていること

user-[INTERACTS]-product-[INTERACTS]-user-[INTERACTS]-productというパスについて平均的な考えを持ちたいと思います。平易な英語で、そっくりさんのユーザーがどの製品とやり取りしているか知りたいです。たとえば、製品 A と B を操作する場合、これらの製品を操作するユーザーは通常、これらの他の製品と操作します。

アマゾンがやっていることです。

私の問題

上記のパターンに単純に一致させることはできません。実行に時間がかかりすぎます。したがって、ユーザーをサンプリングすることしかできず、次のことができると考えました。

  • ユーザーが操作した最後の 20 製品のみを取得する
  • 上記の各製品を使用している最後の 20 ユーザーのみを取得します
  • これらのユーザーが操作した最後の 20 個の製品のみを取得し、各製品の発生をカウントします

しかし、これが 1 つの Cypher クエリで可能かどうかはわかりません。

最も近いのは次のクエリでした。しかし、それでも長すぎて、私が望むことはできません。基本的に、ルートユーザーと共通の「最新」製品を持つ「最新」ユーザーが使用する最新製品を提供します。これは論理的に思えますが、ユーザーのアクティビティをサンプリングできません。

START u=node:node_auto_index('UserId:9554')  
MATCH 
    u-[i1:INTERACTS]-p1  
WITH 
    u,p1,i1 
LIMIT 20  
MATCH 
    p1-[i2:INTERACTS]-u1 
WHERE 
    NOT(u1=u) 
WITH 
    i1,i2,u1,p1 
LIMIT 400  
MATCH 
    u1-[i3:INTERACTS]-p 
WHERE 
    NOT(p1=p) AND p.ProjectId = {ProjectId} AND p.IsActive? = 1 
RETURN 
    i1.Label, i2.Label,i3.Label, p.ItemId,count(p) as count
LIMIT 8000 

私は今どこにいますか

いくつかの失敗したテストの後、Java API を使用してコーディングしようとしましたが、はるかに単純で簡単です。しかし、好奇心から、今のところ私のシステムはCypherを使用しているため、これを行う方法を知りたいです

テストのために、私の質問は次のように要約できると思います。パターンが与えられた場合、各深さの最後の 2 つのノードは何ですか。

テストするためにhttp://console.neo4j.org/?id=inf2hnを作成しました。私が探している最終結果は次のようになるはずです:

Product 2 | User 3 | Product 5
Product 2 | User 3 | Product 6
Product 2 | User 4 | Product 5
Product 2 | User 4 | Product 6
Product 3 | User 3 | Product 5
Product 3 | User 3 | Product 6
Product 3 | User 4 | Product 5
Product 3 | User 4 | Product 6

ご協力いただきありがとうございます

4

2 に答える 2

1

コメントで言及したことは、単純なクエリではない可能性があるという事実を反映していると思います。私は Neo4j を使用して推奨事項を書きましたが、製品とのさまざまなタイプの相互作用とそれらの重要性をすべて説明するために必要なもののように思えます。それに基づいて、ユーザーの製品インタラクションのランク付けされたリスト、つまりユーザーが最も「興味を持っている」製品を形成します。別のユーザーに推奨する製品を見つけるには、ユーザーが他のユーザーとどの程度類似しているかを計算し、それらを使用できます。製品を推奨するための出発点として (私の好みがあなたの好みに似ている場合、私はあなたと同じ製品に興味があるかもしれません)。

役立つかもしれないいくつかのブログ:

http://blog.everymansoftware.com/2012/02/similarity-based-recommendation-engines.html

http://thought-bytes.blogspot.in/2012/02/similarity-based-recommendations-with.html

免責事項: 私は思考バイト ブログの所有者です。

于 2013-06-12T13:41:20.187 に答える
0

まあ、あなたはユーザー向けの推奨事項のように考えさせようとしていると思います..それがまさにあなたが探しているものである場合、私は最近、ユーザーと製品のための独自の推奨エンジンを構築しました..

製品 1、2、3 を購入するユーザー A と、製品 1、2、4 を購入するユーザー B がいるとします。したがって、A、B の類似性に応じてユーザー A に製品を推奨する場合、製品 4 になります。

サイファーでは、次のようになります。

Start inputUser=node:usersIndeinputUser(USER_NAME='A') 
MATCH (inputUser)-[rel1:BUY]->(common_products)<-[rel2:BUY]-(otherUser)-[rel3?:BUY]->(rec_product)  
With  rec_product,inputUser, otherUser
WHERE NOT (rec_product)<-[:BUY]-(inputUser)  
RETURN inputUser , rec_product, , otherUser 

お役に立てば幸いです..

于 2013-06-12T12:41:28.163 に答える