В основном это вопрос дизайна/эффективности, но я хотел посмотреть, есть ли предпочтительный способ справиться с этим в neo4j, а не в sql db.
Сейчас у меня 2 модели - user
и event
. У меня также есть связь между user
и event
, чтобы показать, что они примут участие в мероприятии. Я хочу найти лучший способ представить администратора мероприятия. Другими словами, я хочу иметь возможность запрашивать события, которыми управляет пользователь.
Один из способов сделать это — создать новую связь с именем admin_of
между пользователем и event
. Другой способ — создать свойство администратора отношения присутствия. Что-то вроде admin: true
Запрос admin_of
кажется простым, но добавляет еще одно отношение к db. Позже он также сможет обрабатывать нескольких администраторов.
Я думаю, что последний способ можно запросить примерно так: (из документации) 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'
current_user.friends.events.query_as(:event).match("event<-[invite:INVITED_BY]-(user: User)<-[friends_with:FRIENDS_WITH]-(user)").where(invite: {admin: true}, event: {detail: 'property'}).pluck(:event)
или что-то в этом роде. - person subvertallchris   schedule 26.11.2014MATCH (user0:
User), (node2:
User), user0-[rel0:
friends_with]-(node2:
User), (event:
Event), node2-[rel1:
invited]-(event:
Event), event<-[invite:INVITED]-(user: User)<-[friends_with:FRIENDS_WITH]-(user: User) WHERE ID(user0) = {ID_user0} AND invite.admin = {invite_admin} RETURN event | {:ID_user0=>0, :invite_admin=>true}
- person Clam   schedule 26.11.2014MATCH (user1:
User), (user2:
User), (event:
Event), event<-[invite:INVITED]-(user: User)<-[friends_with:FRIENDS_WITH]-(user: User) WHERE user1.id = 133342 AND invite.admin = true RETURN event
- person Clam   schedule 26.11.2014MATCH (u:User { id: 133342 }) return u
, он вернется? Какова роль пользователя 1 и пользователя 2 в этом матче, если на то пошло? Они не появляются на этом пути. - person subvertallchris   schedule 26.11.2014MATCH (user1:User), (user2:User), (event:Event), (event)<-[invite:INVITED]-(user2:User)<-[friends_with:FRIENDS_WITH]-(user1:User) RETURN event
Пользователи 1 и 2 являются друзьями - person Clam   schedule 27.11.2014WHERE ID(user1) = 133342
. Ваш новый запрос дает вам что-нибудь? - person subvertallchris   schedule 27.11.2014