Neo4J Cypher:如何通过有条件查询在Reation上获取节点



我有两个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,您可以这样做,并且应该允许您获得ActiveNodeActiveRel对象,但是有一个更较高的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)')

相关内容

  • 没有找到相关文章

最新更新