【发布时间】:2015-01-24 01:27:18
【问题描述】:
这主要是一个设计/效率问题,但我想看看在 neo4j 中是否有更好的方法来处理这个问题,而不是在 sql db 中处理它。
现在我有 2 个模型 - user 和 event。我也有user和event之间的关系,表示他们将参加活动。我想找出代表活动管理员的最佳方式。换句话说,我希望能够查询由用户管理的事件。
一种方法是在用户和event 之间创建一个名为admin_of 的新关系。另一种方法是创建参与关系的管理属性。类似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'
【问题讨论】:
-
要开始拆分查询,请从控制台中的日志中复制 Cypher 并粘贴到 Neo4j 网络浏览器 localhost:7474。您需要用字符串/整数替换参数并添加一个返回值。在你得到某种回应之前,仍然会抽出部分内容。
-
另外,如果您的密码查询,请修复一些问题。给它一个 rel 类型,不要只使用标识符。
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)什么的。 -
那里没有类型会伤害查询吗?例如它获得的效率是多少?我不完全确定用字符串/整数替换参数是什么意思。其中一个查询是
MATCH (user0:User), (node2:User), user0-[rel0:friends_with]-(node2:User), (event:Event), node2-[rel1:invited@ 987654346@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} -
我删掉了一堆没有用..
MATCH (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 -
user1的ID属性真的是133342吗?如果你这样做
MATCH (u:User { id: 133342 }) return u,它会回来吗?在那场比赛中,用户 1 和用户 2 的角色是什么?它们不会出现在该路径中。
标签: ruby-on-rails neo4j relationship neo4j.rb