Rails Neo4j 查找与某个节点相关的所有节点

Rails Neo4j Find all nodes related to some node

假设有 2 个模型:

class A
  include Neo4j::ActiveNode
    property :name, type: String
    has_many :in, :bs, type: :HAS_B
end

class B
  include Neo4j::ActiveNode
    property :name, type: String
end

以及以下节点和关系:

a1 <- b1
a2 <- b1
a3 <- b2
a1 <- b2

现在,我想要 label: A 的所有节点都与 label: B 的特定节点相关。

如何通过 neo4jrb 实现?

用简单的英语,我想要"All nodes labelled A which have a relation to node b1"(这可以扩展到多个节点,比如标签A的所有节点都与节点b1和b2有关系)

我是这样做的:

A.as(:a).B.where(name: [b1])

此处,对于多个 b's,只需发送所有必需的数组 b's

请注意,此查询给出了所有 a's 连接到 数组中 中的任何一个 b's,这符合我在这种情况下的要求.如果你想要的东西给出所有 a's 连接到 all b's,这将不起作用。但是,如果有人遇到这样的查询,post 它在评论中,我将把它包含在这个 post.

您应该将 :bs 关联添加到 class B

class B
  include Neo4j::ActiveNode
    property :name, type: String
    has_many :out, :bs, type: :HAS_B, model_class: :A
end

然后,在找到特定节点 B 后,您可以简单地执行 b.bs。例如 B.where(id: some_id).bs.

如果你想找到所有与节点 b1 或 b2 相关的标签 A 的节点,你可以这样做

A.all.branch { bs.as(:b).where("b.uuid IN [$b1_id, $b2_id]") }.params(b1_id: b1_id, b2_id: b2_id)

如果你想找到与节点 b1 和 b2 相关的标签 A 的所有节点,你可以这样做

A.all.branch { bs.where(id: b1_id) }.branch { bs.where(id: b2_id) }