これは主に設計/効率の問題ですが、SQL db で行う方法とは対照的に、neo4j でこれを処理するための好ましい方法があるかどうかを確認したかったのです。
現在、私は 2 つのモデルを持っています -user
とevent
. 私は と の間にも関係がuser
ありevent
、彼らがイベントに参加することを表明しています。イベントの管理者を代表する最善の方法を見つけたいです。つまり、ユーザーが管理するイベントを照会できるようにしたいと考えています。
admin_of
これを行う 1 つの方法は、ユーザーと の間に新しい関係を作成することですevent
。もう 1 つの方法は、出席関係の管理プロパティを作成することです。何かのようなものadmin: true
クエリは簡単にadmin_of
見えますが、データベースに別の関係を追加します。後で複数の管理者を処理することもできます。
後者の方法は、次のような方法でクエリを実行できると思います: (ドキュメントから)EnrolledIn.where(since: 2002)
したがって、検索にはadmin: true
. ただし、友達のイベントだけにしたいので、これを連鎖させる方法がわかりません。他のwhere
クエリは通常、関係ではなくノードに基づいてプロパティを設定します。
後者の方法はそれを行うための好ましい方法のようですが、それを照会する正しい方法は何でしょうか? それとも、追加の関係を追加しても、最初の方法の方が簡単ですか?
更新: 私はこのようなものを思いついた
result = Event.query_as(:event).match("event<-[invite: INVITED]-(user: User)<-[:FRIENDS_WITH]-(user)").where(invite: {admin: /true/}).pluck(:event)
の詳細なクエリに基づいて
https://github.com/neo4jrb/neo4j/wiki/Search-and-Match
更新 2
私は今これを持っていますが、一致しません。クエリの何が問題なのかを分析する最良の方法は何ですか?
current_user.friends.events.query_as(:event).match("event<-[invite]-(user: User)<-[friends_with]-(user)").where(invite: {admin: true}, event: {detail: 'property'}).pluck(:event)
私のユーザーモデルは
has_many :both, :events, model_class: 'Event', rel_class: 'Invite'
そして私のイベントモデルは
has_many :both, :users, model_class: 'User', rel_class: 'Invite'
私の招待モデルは
from_class Event
to_class User
type 'invited'