Neo4j rb находит связь между двумя узлами

Я использую neo4j.rb в своем приложении для рельсов.

У меня уже есть два узла n1 и n2, извлеченные из базы данных.

Теперь мне нужно проверить, есть ли между ними путь, я думал об использовании шифровальных запросов с помощью Neo4j::Session.query

Но поскольку у меня уже есть два узла, я не хочу извлекать их снова внутри запроса (влияет ли это на производительность?), есть ли способ сделать это?

Я знаю, что могу использовать query1 = n1.query_as(:node1) и использовать его в качестве идентификатора узла, но как я могу ввести n2 в один и тот же объект запроса, чтобы я мог проверить связь между ними.

Я хочу что-то эквивалентное запросу

RETURN 
  CASE 
    WHEN node1-[*..6]-node2  
    THEN 'Connected within 6 nodes'  
    ELSE 'Not connected within 6' 
  END

Где у меня уже есть node1 и node2.

Есть ли способ сделать это, а также можно ли это сделать без использования CYPHER DSL?


person Artemis Fowl    schedule 17.10.2015    source источник
comment
Я не знаю, кто проголосовал против, но это отличный вопрос, спасибо!   -  person Brian Underwood    schedule 18.10.2015


Ответы (1)


Ну вот!

n1.query_as(:n1).match_nodes(n2: n2).match('n1-[*1..6]-n2').count

Если вы хотите избежать Cypher DSL, я думаю, вы можете сделать это с помощью ассоциаций. В качестве начального примера для прохождения одного уровня отношений вы можете сделать это:

class N1Class
  include Neo4j::ActiveNode

  has_many :out, :test_association, type: :TEST_ASSOCIATION, model_class: :N2Class
end

n1.test_association.include?(n2)

Это проверит, связаны ли они напрямую через ассоциацию test_association. Вы даже можете указать false, чтобы ваш type игнорировал направление, и false, чтобы model_class игнорировал целевые метки.

Чтобы получить переменную длину, вы можете сделать это:

n1.test_association(nil, nil, rel_length: 1..6).include?(n2)
person Brian Underwood    schedule 18.10.2015
comment
Хорошо, я не знал, вы можете сделать это без шифрования DSL, есть ли способ получить кратчайший путь между двумя узлами? - person Vikash B; 18.10.2015
comment
Да, я тоже думал о том же, мой шифр не работал, он возвращал URL-адреса узлов, я отправлю еще один вопрос. - person Artemis Fowl; 18.10.2015
comment
Хорошая идея! Я не думаю, что вы можете сделать это вне Cypher DSL, но я только что создал этот выпуск, чтобы зафиксировать его: github.com/neo4jrb/neo4j/issues/994 - person Brian Underwood; 18.10.2015