如何使用jbuilder从Neo4j :: ActiveModel生成GraphJSON

时间:2018-03-27 11:25:08

标签: ruby-on-rails json ruby neo4j graph-databases

用于在浏览器alchemy.js中呈现图表数据的前端库需要GraphJSON格式的数据,该格式主要包含nodesedges个顶级键

考虑Services可以dependencies(以及dependent_services)的图表:

class Service
  include Neo4j::ActiveNode
  has_many :out, :dependencies, type: :DEPENDS_ON, model_class: :Service
  has_many :in, :dependent_services, origin: :dependencies, model_class: :Service
end

在jbuilder模板中检索节点数据就像一个魅力:

nodes = ([service] + service.dependencies + service.dependent_services).uniq
json.nodes nodes do |node|
  json.id node.id
  json.name node.name
  json.type node.class.to_s
  json.url "#{url_for(node)}.json"
end

是否有一种简洁的方法来检索节点之间的边缘列表(关系)

1 个答案:

答案 0 :(得分:1)

我找到了一个相对优雅的解决方案,以防万一其他人正在寻找这个:

# Collect all relations into flat array
relations = [service.dependencies, service.dependent_services].map {|r| r.rels}.flatten
# Collect relation into edges array
json.edges relations.map do |edge|
  json.source edge.start_node_id.to_s.to_i
  json.target edge.end_node_id.to_s.to_i
  json.caption edge.type
end

当然第二部分是jbuilder特定的,但最重要的是.rels属性,其中包含所有传出/传入关系的列表。

我正在使用neo4j gem @ 9.0.7,文档可以在这里找到:https://github.com/neo4jrb/neo4j-core/wiki/Relationship