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

标签 neo4j match

我正在使用 neo4j graph db,它在 Ruby on Rails 中使用, 例如: 我有3个tom和jerry的关系,他们合作盖了3栋房子,现在我只想匹配3个中的1个;查询代码怎么写???
我试过这个:这是我的代码:

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

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

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

如何解决?

最佳答案

为每个相关节点只获取一个关系:

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)

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

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

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)

关于neo4j - 如何只匹配两个节点之间的一种关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32389657/

相关文章:

neo4j - 如何重命名 Neo4j 中的关系?

regex - 使用Powershell匹配文本文件中所有出现的模式

javascript - 正则表达式在方括号之间抓取字符串

c - ANSI C 中的匹配单词

neo4j - Neo4j 中的 RETURN 子句是否可以通过 true 或 false 聚合 bool 值?

java - Neo4j 1.8.1 中 TraversalDescription.toJson 的替换

maven - spring boot 2.0 neo4j ogm 3.0兼容jetty版本

c++ - CPP、错误、类、即使给出了声明也不匹配

python - 通过公共(public)标识符交叉识别(重叠)Python 中的两个列表

Neo4j - 如何设置用户名和密码