我有两个neo4j节点和一个关系:
class StayPal
include Neo4j::ActiveNode
has_many :in, :places, origin: :owner
has_many :in, :shared_places, rel_class: 'HouseMate'
end
class Place
include Neo4j::ActiveNode
has_one :out, :owner, type: :owner_of, model_class: 'StayPal'
has_many :out, :house_mates, rel_class: 'HouseMate'
end
class HouseMate
include Neo4j::ActiveRel
include Enumable
creates_unique
from_class 'Place'
to_class 'StayPal'
type 'shared_with'
property :status, default: 0
enum_attr status: [:pending, :approved, :declined, :cancelled]
end
目标:我的目标是获取位置&sears_places of Staypal在一起,但如果是状态,则包含共享位置==批准
查询:
Neo4j::Session.current.query
.match(n: { StayPal: { user_id: 1 } })
.match('n<-[rel1:`owner_of`]-(result_places:`Place`)')
.match('n<-[rel2:`shared_with`]-(result_places1:`Place`)')
.pluck(:result_places1, :result_places)
这样,我得到了Staypal的位置和共享位置
但我想要共享的地方= 1
修改的查询
Neo4j::Session.current.query
.match(n: { StayPal: { user_id: 1 } })
.match('n<-[rel1:`owner_of`]-(result_places:`Place`)')
.match('n<-[rel2:`shared_with`]-result_places1:`Place`)')
.where('result_places1.status = 1')
.pluck(:result_places1, :result_places)
但是,我没有记录
其他一些帮助查询
Neo4j::Session.current.query
.match(n: { StayPal: { user_id: 1 } })
.match('n<-[rel1:`owner_of`]-(result_places:`Place`)')
.match('n<-[rel2:`shared_with`]-result_places1:`Place`)')
.where('result_places1.status = 1')
.pluck(:result_places1)
输出:
[CypherRelationship 1239]
您使用的是neo4j-core
查询API,您可以这样做,并且应该允许您获得ActiveNode
和ActiveRel
对象,但是有一个更较高的API,它更容易:
StayPal.where(user_id: 1).places(:place1).shared_places(:places2).pluck(:place1, place2)
为此,我假设您将此关联添加到Place
:
has_many :both, :shared_places, type: :shared_with
请注意,我使用了变量的单数形式。重要的是要记住,当您与之匹配时,一次进行一次匹配。奇异变量有助于我们将其保持在上下文中。
除此之外,我认为您有一个更深层次的问题,即您的HouseMate
关系从一个地方到StayPal
。您的模型是什么?如果您想记录两个人住在同一所房子里,您可能想拥有一个带有HouseMateGroup
这样标签的新节点,该节点可以指向该位置以及两个(或更多)staypals。
编辑:
我认为我更了解您的用例。我可能会制作型号(:StayPal)-[:LIVES_IN]->(:Place)<-[:LIVES_IN]-(:StayPal)
任何给定的步骤均未映射到"家庭伴侣"的想法,但是您可以通过遵循关系/协会轻松获得室友。因此,如果您想获得室友,您可能会这样做:
pal = StayPal.find_by(user_id: 1)
pal.places.people
,这会让您所有的人在user_id: 1
所在的地方。
如果您想找到所有有相关人员的地方:
Place.as(:place1).people.places(:place2).pluck(:place1, :place2)
您甚至可以计算在地点之间这种关系中存在的人数:
Place.as(:place1).people(:person).places(:place2).pluck(:place1, :place2, 'count(person)')