Rails Neo4j Найти все узлы, связанные с каким-то узлом
Скажем, есть 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?
В простом английском я хочу "Все узлы, помеченные A, которые имеют отношение к узлу b1" (и это может быть расширено до нескольких узлов, как и все узлы метки A, которые имеют отношение к узлам b1 и b2)
2 ответа
Вот как я это сделал:
A.as(:a).B.where(name: [b1])
Здесь для нескольких b's
Просто отправьте массив всех необходимых b's
,
Обратите внимание, что этот запрос дает все a's
которые связаны с любым из b's
в массиве, который соответствует моему требованию в этом случае. Если вы хотите что-то, что дает все a's
которые связаны со всеми b's
это не сработает. Однако, если кто-то сталкивается с таким запросом, опубликуйте его в комментариях, и я включу его здесь, в этот пост.
Вы должны добавить :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
,
Если вы хотите найти все узлы метки A, которые связаны с узлами b1 ИЛИ b2, вы можете сделать
A.all.branch { bs.as(:b).where("b.uuid IN [$b1_id, $b2_id]") }.params(b1_id: b1_id, b2_id: b2_id)
Если вы хотите найти все узлы метки A, которые связаны с узлами b1 и b2, вы можете сделать
A.all.branch { bs.where(id: b1_id) }.branch { bs.where(id: b2_id) }