ArangoDB的pyArango图绘制API

5

我正在使用ArangoDB社区版,可以在创建的图形中使用AQL进行查询,并以JSON格式获取结果,这些结果可以在ArangoDB Web界面工具上进行图形化可视化。

AQL查询

FOR v,e,p IN 1..3 OUTBOUND 'germanCity/Hamburg' GRAPH 'routeplanner' 
OPTIONS{bfs :true} 
RETURN p

JSON 输出

[
  {
    "edges": [
      {
        "_key": "6392826",
        "_id": "germanHighway/6392826",
        "_from": "germanCity/Hamburg",
        "_to": "germanCity/Cologne",
        "_rev": "_WmZ77pW--D",
        "distance": 500
      }
    ],
    "vertices": [
      {
        "_key": "Hamburg",
        "_id": "germanCity/Hamburg",
        "_rev": "_WmZ77Z---_",
        "population": 1000000,
        "isCapital": false,
        "loc": [
          53.5653,
          10.0014
        ]
      },
      {
        "_key": "Cologne",
        "_id": "germanCity/Cologne",
        "_rev": "_WmZ77Y6--B",
        "population": 1000000,
        "isCapital": false,
        "loc": [
          50.9364,
          6.9528
        ]
      }
    ]
  },
  {
    "edges": [
      {
        "_key": "6392840",
        "_id": "internationalHighway/6392840",
        "_from": "germanCity/Hamburg",
        "_to": "frenchCity/Paris",
        "_rev": "_WmZ77pa--_",
        "distance": 900
      }
    ],
    "vertices": [
      {
        "_key": "Hamburg",
        "_id": "germanCity/Hamburg",
        "_rev": "_WmZ77Z---_",
        "population": 1000000,
        "isCapital": false,
        "loc": [
          53.5653,
          10.0014
        ]
      },
      {
        "_key": "Paris",
        "_id": "frenchCity/Paris",
        "_rev": "_WmZ77Z---D",
        "population": 4000000,
        "isCapital": true,
        "loc": [
          48.8567,
          2.3508
        ]
      }
    ]
  },
  {
    "edges": [
      {
        "_key": "6392843",
        "_id": "internationalHighway/6392843",
        "_from": "germanCity/Hamburg",
        "_to": "frenchCity/Lyon",
        "_rev": "_WmZ77pa--B",
        "distance": 1300
      }
    ],
    "vertices": [
      {
        "_key": "Hamburg",
        "_id": "germanCity/Hamburg",
        "_rev": "_WmZ77Z---_",
        "population": 1000000,
        "isCapital": false,
        "loc": [
          53.5653,
          10.0014
        ]
      },
      {
        "_key": "Lyon",
        "_id": "frenchCity/Lyon",
        "_rev": "_WmZ77Z---B",
        "population": 80000,
        "isCapital": false,
        "loc": [
          45.76,
          4.84
        ]
      }
    ]
  }
]

等效图

Graph Viewer

由于我们可以在Web界面中获取可视化的图形输出,因此我希望在Language<->ArangoDB中显示相同的内容。这里的语言可以是支持的驱动程序语言:Python、Java、C#等。

我正在使用pyArango与ArangoDB进行接口交互。

我找不到用于获取此图形可视化的ArangoDB API,例如JPG或matlibplot。

除了使用以下两个选项之外,还有其他方法吗?

  1. 使用networkx.draw(networkx.graph)
  2. matplotlib.pyplot
1个回答

6
如果您需要图形可视化,则 Graphviz 库适合您。如果 Python 可以使用,则只需要一个 Python 绑定库 graphviz(内部利用 DOT 语言 表示)。将 Arango DB 中的 JSON 数据提供给 graphviz 进行渲染非常容易。您可以根据自己的喜好进行自定义,添加标签、颜色、改变节点形状等等。以下是一个简单的示例,展示了您的样本 JSON:
from graphviz import Digraph

arango_graph = [
    {
        "edges": [
            {
                "_key": "6392826",
                "_id": "germanHighway/6392826",
                "_from": "germanCity/Hamburg",
                "_to": "germanCity/Cologne",
                "_rev": "_WmZ77pW--D",
                "distance": 500
            }
        ],
        "vertices": [
            {
                "_key": "Hamburg",
                "_id": "germanCity/Hamburg",
                "_rev": "_WmZ77Z---_",
                "population": 1000000,
                "isCapital": False,
                "loc": [
                    53.5653,
                    10.0014
                ]
            },
            {
                "_key": "Cologne",
                "_id": "germanCity/Cologne",
                "_rev": "_WmZ77Y6--B",
                "population": 1000000,
                "isCapital": False,
                "loc": [
                    50.9364,
                    6.9528
                ]
            }
        ]
    },
    {
        "edges": [
            {
                "_key": "6392840",
                "_id": "internationalHighway/6392840",
                "_from": "germanCity/Hamburg",
                "_to": "frenchCity/Paris",
                "_rev": "_WmZ77pa--_",
                "distance": 900
            }
        ],
        "vertices": [
            {
                "_key": "Hamburg",
                "_id": "germanCity/Hamburg",
                "_rev": "_WmZ77Z---_",
                "population": 1000000,
                "isCapital": False,
                "loc": [
                    53.5653,
                    10.0014
                ]
            },
            {
                "_key": "Paris",
                "_id": "frenchCity/Paris",
                "_rev": "_WmZ77Z---D",
                "population": 4000000,
                "isCapital": True,
                "loc": [
                    48.8567,
                    2.3508
                ]
            }
        ]
    },
    {
        "edges": [
            {
                "_key": "6392843",
                "_id": "internationalHighway/6392843",
                "_from": "germanCity/Hamburg",
                "_to": "frenchCity/Lyon",
                "_rev": "_WmZ77pa--B",
                "distance": 1300
            }
        ],
        "vertices": [
            {
                "_key": "Hamburg",
                "_id": "germanCity/Hamburg",
                "_rev": "_WmZ77Z---_",
                "population": 1000000,
                "isCapital": False,
                "loc": [
                    53.5653,
                    10.0014
                ]
            },
            {
                "_key": "Lyon",
                "_id": "frenchCity/Lyon",
                "_rev": "_WmZ77Z---B",
                "population": 80000,
                "isCapital": False,
                "loc": [
                    45.76,
                    4.84
                ]
            }
        ]
    }
]

graph_name = 'amazing'

g = Digraph(graph_name, filename=graph_name, format='jpeg', engine='neato')
g.attr(scale='2', label='Look at my graph my graph is amazing!', fontsize='18')
g.attr('node', shape='circle', fixedsize='true', width='1')

for item in arango_graph:
    for vertex in item['vertices']:
        g.node(vertex['_id'], label=vertex['_key'])
    for edge in item['edges']:
        g.edge(edge['_from'], edge['_to'], label=str(edge['distance']))

# Render to file into some directory
g.render(directory='/tmp/', filename=graph_name)
# Or just show rendered file using system default program
g.view()

只需三行代码进行自定义,再加上五行代码来供图形可视化渲染器使用。请注意,Arango Web UI不会呈现同一对节点之间的所有边缘,而graphviz会,并且您可以为每个边缘设置不同的样式。

您需要安装graphviz库和Python绑定。

步骤#1:安装库

假设您的机器是Ubuntu:

sudo apt install graphviz

步骤#2:获取Python绑定

pipenv install graphviz

如果你还没有使用Pipenv,你可以使用老牌的Pip进行安装:
pip install graphviz

步骤 #3:运行示例并享受

Amazing graph, rendered in JPEG


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接