如何只匹配两个节点之间的一个关系

时间:2015-09-04 03:34:10

标签: neo4j match

我正在使用neo4j graph db,它在Ruby on Rails中使用, 例如: 我有汤姆和杰里之间的3个关系,他们合作建立3个房子,现在我只想匹配3个中的1个;如何编写查询代码???
 我试过这个:这是我的代码:

Neo4j::Session
             .query("MATCH (s1:Scholar)<-[r:COOPERATE]-(s2:Scholar) WHERE s1.id = #{@scholar.id}  RETURN  DISTINCT r ")

结果是s1和s2之间的所有关系都成立了

我只需要s1和s2之间的关系1(我想在我的数据库中找到所有关系,但我只需要每2个节点之间有一个)

如何解决?

1 个答案:

答案 0 :(得分:3)

为每个相关节点仅获得一个关系:

MATCH (s1:Scholar)<-[r:COOPERATE]-(s2:Scholar) WHERE s1.id = {s1_id} RETURN s2, collect(r)[0] AS r

请注意,我使用的是更安全的参数(如果数据来自用户)并允许Neo4j缓存您的查询。要在neo4j-core gem中使用参数:

session.query("MATCH (s1:Scholar)<-[r:COOPERATE]-(s2:Scholar) WHERE s1.id = {s1_id} RETURN s2, collect(r)[0]", s1_id: @scholar.id).map(&:r)

还有一个查询构建API,如下所示:

session.query
  .match('(s1:Scholar)<-[r:COOPERATE]-(s2:Scholar)')
  .where(s1: {id: @scholar.id})
  .return('s2, collect(r)[0] AS r')
  .map(&:r)

请注意,这将为您使用参数。

此外,如果您使用ActiveNode gem中的neo4j模块(而不是进行原始查询),您可以执行类似的操作;

class Scholar
  include Neo4j::ActiveNode
  id_property :id

  has_many :in, :cooporates_with, type: :COOPERATE, model_class: :Scholar
end

Scholar.find(@scholar.id).cooporates_with(:s2, :r).return('s2, collect(r)[0] AS r').map(&:r)