2016-03-20 5 views
0

更新:はのNeo4jデータベース内のレコードごとにタイマーを実装したい

私は何を探していますが、私が望むよう仕事をする自動トリガ機構のいくつかの種類があります。

ユースケース:

ポストのスコアに基づいてランク付け。投稿の合計得点は、a)この投稿のスコアプラスb)すべてのコメントのスコアの合計です。 aとbはいずれも初期スコアが10で、作成から24時間ごとに0になるまで1ポイント減少します。投稿の合計スコアが0になると、それ以降は非アクティブとみなされ、ランクから削除されますが、他の目的のためのデータベース。この非アクティブな投稿は、今後ユーザーがコメントしてもアクティブにならなくなります。

neo4jデータベースの各レコードのタイマーを実装する際に問題が発生しました。

100万レコードがあるとします。投稿の投稿かコメントです。作成時には10ポイント、作成後24時間ごとに1ポイント減少して0になり、非アクティブとみなされます(タイマー設定)。

私は、スコアの属性を作成して、属性を24時間ごとに更新するという考えはありません。しかし、データのサイズ(ユーザーが投稿やコメントを作成するときに増加している)を考えると、集中的なデータベース操作は非常に遅いです。

タイマーやニーズを満たすその他の方法を実装する方法はありますか?

ありがとうございました。

+0

neo4j-expireモジュールを見てみると、ユースケースはそのままでは扱えませんが、Javaでモジュールを構築するための良い基礎として役立ちます。 https://github.com/graphaware/neo4j-expire –

+1

あなたのケースはわかりませんが、なぜタイマーが必要ですか?作成時間が足りませんか?いくつかのノードを呼び出すたびに残りの時間を計算することができます。申し訳ありませんofftopic) – Evgen

+0

@エヴェン、ちょうどユースケースを更新します。私のニーズを明確にすることを願っています。 –

答えて

0

@Evgenが示唆しているように、1つの方法は、作成時間を保存し、クエリを実行してスコアを計算することです。例えば

は、コメントを作成します。

CREATE (c:Comment {creationTime: timestamp(), text: {some_text}}) 

timestamp()サイファー機能はエポックからのミリ秒形式を使用して、現在のサーバー時刻に評価します。すべてのアクティブなコメント

問合せ:

MATCH (c:Comment) WHERE c.creationTime < (timestamp() + 86400000) 
RETURN c 

24時間以内に作成されたすべてのコメントを検索します。

CREATE INDEX ON Comment(creationTime); 

を計算し、すべてのアクティブなコメントのためのポイントを返します:creationTimeプロパティにインデックスを作成するようにしてください

のは、あなたが特定のポストのすべてのアクティブなコメントを見つけるとコメントを返すようにしたいとしましょう、スコア順。

MATCH (p:Post {name: "somepost"})<-[:IS_ABOUT]-(c:Comment) 
WHERE c.creationTime < (timestamp() + 86400000) 
RETURN c, 10 - ((timestamp() - c.creationTime)/3600000) AS points 
+0

申し訳ありませんが、私は十分に明確にしていませんでした。私が探しているのは、私が望むように仕事をする何らかの自動トリガーメカニズムです。 neo4j(またはそのプラグイン)がこの機能を提供するかどうかはわかりません。私が理解するには、これらのクエリをトリガする必要がありますそれが存在していれば、すべてのレコードをこのトリガーでバインドする必要がありますか? –

0

私の素朴な考えは、我々は、スコアと更新 の属性属性24時間ごとに作成することです。しかし、データのサイズ(投稿とコメントを作成するときに が増えています)を考えると、集中的なデータベース の操作は非常に遅いです。

ここでの解決策は、それがもはやアクティブではないことを初めて理解した後に、コメントと投稿のラベルを変更することだと思います。したがって、毎回すべてのコメントと投稿を実行する必要はなく、関連性があるだけです。実装は異なる可能性があります。

MATCH (c:Comment) Set c.points = c.points-1 with c 
    Match(c) where c.points = 0 remove c:Comment set c:InactiveComment 

また、作成時間を使用することもできます。

更新:

ラベルコメントを削除したくない場合は、コメントを削除してください。新しい投稿またはコメントを作成するたびに、それらにラベルを設定することができます:新規:コメント、:新規:投稿。投稿後、コメントは非アクティブになり、ラベルNewを削除します。あなたはまだ良好なパフォーマンスを持っています:新しい:コメント< <:コメント必要なときにいつでも関連するデータだけを照会することで利益を得ることができます。

+0

ありがとうございます。しかし、私は最初のクエリを理解していない、MATCH(c:Comment)c.points = c.points-1をcと設定する。ここで何をするのですか? –

+0

申し訳ありませんが、私は十分に明確にしていませんでした。私が探しているのは、私が望むように仕事をする何らかの自動トリガーメカニズムです。 neo4j(またはそのプラグイン)がこの機能を提供するかどうかはわかりません。私が理解するには、これらのクエリをトリガする必要がありますそれが存在していれば、すべてのレコードをこのトリガーでバインドする必要がありますか? –

+0

私はすでに24時間ツールをtrigerにツールを持っていると仮定したので、このクエリはコメントのポイントを減らします。ポイントが0になるとラベルが変わるので、将来は無関係なデータが得られません。あなたがこのツールを持っていない場合は、Javaでneo4jクエリを実行する方法の例を見てみてください。ここを見てくださいhttp://stackoverflow.com/questions/7577620/linux-start-up-script-for-java-applicationまた、私はクエリを実行するようにブッシュスクリプトを構成することが可能であることを知っているので、この可能性を探すかもし​​れません。 – Evgen

関連する問題