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) }
Другие вопросы по тегам