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
ご協力いただきありがとうございます