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) }
假设有 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) }