Получение подграфа с помощью neo4j.rb - PullRequest
3 голосов
/ 24 февраля 2020

В настоящее время есть схема графа, определенная с одним типом узла и одним типом отношения. Моя цель - передать определенный подграф утилите визуализации графа для отображения, поэтому мне нужно получить все узлы и все отношения между узлами. В частности, подграф - это подграф, начинающийся в узле n и продолжающийся max_steps ребер от n .

Пока что у меня есть кое-что строки:

class Position
  include Neo4j::ActiveNode

  has_many :out, :next, relationship_class: :To

  def get_next_subgraph( max_steps = 1 )
    nodes = []
    edges = []

    data = self.as(:n)
           .next(:m, :r, rel_length: max_steps )
           .pluck(:m, :r)

    data.each do |n, r|
      nodes.append n
      edges.append r[0]
    end

    return {
        nodes: nodes,
        edges: edges
    }

  end  
end

, который используется примерно следующим образом:

pos = Position.find('24325')
sg = pos.get_next_subgraph()

sg[:edges].each do |edge|
  edge.from_node.uuid
end

Проблема, с которой я сталкиваюсь, заключается в том, что from_node и to_node ленивы загруженный, neo4j.rb выполняет дополнительный запрос каждый раз, когда я пытаюсь получить доступ к uuid определенного отношения, которое необходимо для идентификации узла на каждом конце ребра. Итак, мне нужно либо сопоставить from_node и to_node с соответствующими узлами (которые уже возвращены с запросом), либо каким-либо другим способом получить from_node / to_node uuids.

У меня есть несколько других идей о том, как это сделать, но я потратил достаточно времени на то, что кажется достаточно распространенным паттерном, и мне кажется, что я что-то упускаю.

Итак, вкратце, каков правильный / идиоматический c способ использования neo4j.rb для извлечения подграфа в одном запросе?

(Для контекста это в конечном итоге будет отправлено обратно в ответ на GraphQL запрос.)

...