2016-02-08 1 views
1

Я пытаюсь получить визуализацию с использованием d3.js или alchemy.js - но, в частности, алхимия требует, чтобы источник данных находился в GraphJSON.от Neo4j до GraphJSON с Ruby

Я играл с учебниками и примерами Макс Де Марзи (используя неографию), Майклом Хунгером (cy2neo, js), Neo4j и Neo4j.rb - но я, похоже, не могу пройти весь путь туда , В основном потому, что я не знаю, что я делаю, но именно так я и пытаюсь учиться.

То, что я пытаюсь добиться бы вдоль линий: https://bl.ocks.org/mbostock/3750558 или визуализации по умолчанию здесь: http://graphalchemist.github.io/Alchemy/#/docs

И вы можете увидеть, что GraphJSON форматирование должно выглядеть, найдя его на этой странице также: http://graphalchemist.github.io/Alchemy/#/docs

Если я запускаю следующее ...

get '/followers' do 
    Neo4j::Session.open(:server_db, "http://localhost:7474") 
    query = Neo4j::Session.query('MATCH (a--(b)--(c) RETURN a,b,c LIMIT 30') 
    puts "--------------" 
    puts query_to_graph_json(query) 
    query_to_graph_json(query) 
end 

# This is supposed to grab nodes and edges, but it never gets edges. 
# It's originally from a conversation at the neo4j.rb site 

    def query_to_graph_json(query) 
    nodes = {} 
    edges = {} 

    add_datum = Proc.new do |datum| 
     case datum 
     when Neo4j::ActiveNode, Neo4j::Server::CypherNode 
     nodes[datum.neo_id] = { 
     id: datum.neo_id, 
     properties: datum.props #was attributes, but kept saying that wasn't a method 
     } 
     when Neo4j::ActiveRel, Neo4j::Server::CypherRelationship 
     edges[[datum.start_node.neo_id, datum.end_node.neo_id]] = { 
     source: datum.start_node.neo_id, 
     target: datum.end_node.neo_id, 
     type: datum.rel_type, 
     properties: datum.props 
     } 
     else 
     raise "Invalid value found: #{datum.inspect}" 
     end 
    end 

    query.each do |row| 
     row.to_a.each do |datum| 
     if datum.is_a?(Array) 
      datum.each {|d| add_datum.call(d) } 
     else 
      add_datum.call(datum) 
     end 
     end 
    end 

    { 
     nodes: nodes.values, 
     edges: edges.values 
    }.to_json 
    end 

Я буду получать ...

{ 
    "nodes": [ 
    { 
     "id": 597, 
     "properties": { 
     "name": "John", 
     "type": "Person" 
     } 
    }, 
    { 
     "id": 127, 
     "properties": { 
     "name": "Chris", 
     "type": "Person" 
     } 
    }, 
    { 
     "id": 129, 
     "properties": { 
     "name": "Suzie", 
     "type": "Person" 
     } 
    }, 
], 
    "edges": [ 

    ] 
} 

Проблема в том, что мне нужны ребра.

Если я бегу ...

get '/followers' do 
    content_type :json 
    neo = Neography::Rest.new("http://localhost:7474") 
    cypher = "MATCH (a)--(b)--(c) RETURN ID(a),a.name,ID(b),b.name,ID(c),c.name LIMIT 30" 
    puts neo.execute_query(cypher).to_json 
end 

Я получаю таблицу путей. Но он не отформатирован так, как мне нужно, и я понятия не имею, как он может получить этот формат в формате GraphJSON.

{ 
    "columns": [ 
    "ID(a)", 
    "a.name", 
    "ID(b)", 
    "b.name", 
    "ID(c)", 
    "c.name" 
    ], 
    "data": [ 
    [ 
     597, 
     "John", 
     127, 
     "Chris", 
     129, 
     "Suzie" 
    ], 
    [ 
     597, 
     "John", 
     6, 
     "Adam", 
     595, 
     "Pee-Wee" 
    ] 
    ] 
} 

ответ

1

Я думаю, что одна проблема, с которой вы сталкиваетесь, заключается в том, что вместо сопоставления двух узлов и одной связи вы сопоставляете три узла и два отношения. Вот ваш MATCH:

MATCH (a)--(b)--(c) 

Это должно быть, как:

MATCH (a)-[b]-(c) 

В статье MATCH[] могут быть исключены, и вы можете просто сделать сырой -- (или --> или <--), который представляет собой отношение ,

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

Использование neo4j-core (который я смещена в сторону, как один из сопровождающим;)

nodes = [] 
rels = [] 
session.query('(source)-[rel]->(target)').pluck(:source, :rel, :target).each do |source, rel, target| 
    nodes << source 
    nodes << target 
    rels << rel 
end 

{ 
    nodes: nodes, 
    edges: rels 
}.to_json 

Также обратите внимание, что если вы не указываете какие-либо этикетки ваш запрос может быть медленным, в зависимости от количества узлов). Зависит от того, что вам нужно;)

1

Этот Cypher запрос должен возвращать массив ребер согласно примеру формат:

MATCH (a)-[r]-(b) 
WITH collect(
    { 
     source: id(a), 
     target: id(b), 
     caption: type(r) 
    } 
) AS edges 
RETURN edges 

Запуск этого в отношении некоторых выборочных данных, результаты выглядят следующим образом:

[ 
      { 
      "source": 9456, 
      "target": 9454, 
      "caption": "LIKES" 
      }, 
      { 
      "source": 9456, 
      "target": 9454, 
      "caption": "LIKES" 
      }, 
      { 
      "source": 9456, 
      "target": 9455, 
      "caption": "LIKES" 
      }, 
      { 
      "source": 9454, 
      "target": 9456, 
      "caption": "LIKES" 
      } 
] 
Смежные вопросы