Визуализируйте график RDFLIB в Python

Я новичок в RDFLIB в Python. Я нашел здесь пример создания графика. Как проще всего визуализировать граф, созданный этим кодом?

import rdflib
# Now we create a graph, a representaiton of the ontology
g = rdflib.Graph()

# Now define the key words that we will use (the edge weights of the graph)
has_border_with = rdflib.URIRef('http://www.example.org/has_border_with')
located_in = rdflib.URIRef('http://www.example.org/located_in')

# define the things - base level objects that will be the nodes
# In this case first we have countries
germany = rdflib.URIRef('http://www.example.org/country1')
france = rdflib.URIRef('http://www.example.org/country2')
china = rdflib.URIRef('http://www.example.org/country3')
mongolia = rdflib.URIRef('http://www.example.org/country4')

# then we have continents
europa = rdflib.URIRef('http://www.example.org/part1')
asia = rdflib.URIRef('http://www.example.org/part2')

# Having defined the things and the edge weights, now assemble the graph
g.add((germany,has_border_with,france))
g.add((china,has_border_with,mongolia))
g.add((germany,located_in,europa))
g.add((france,located_in,europa))
g.add((china,located_in,asia))
g.add((mongolia,located_in,asia))

Я вижу, что в пакете rdflib есть компонент инструментов, который имеет функцию под названием rdfs2dot. Как я могу использовать эту функцию для отображения графика с графиком RDF в нем?


person MadProgrammer    schedule 01.09.2016    source источник
comment
Я посмотрел, но не смог найти полного решения. Я обнаружил, что rdfs2dot - это инструмент командной строки: вы должны сначала экспортировать свой график g.serialize("world.rdf"), затем преобразовать его в точечный синтаксис: rdfs2dot world.rdf > world.dot, а затем использовать любые инструменты, позволяющие строить точечные графики. Например xdot xdot world.dot. По какой-то причине rdfs2dot выдает пустой график. Согласно документу Graph.serialize, rdf должен быть форматом по умолчанию, поэтому либо здесь, либо в rdfs2dot есть ошибка. Возможно, посмотрите открытые тикеты на github или опубликуйте новый выпуск.   -  person Emilien    schedule 01.09.2016
comment
Спасибо! Это имеет смысл. Поэтому вам нужно сначала экспортировать график, а затем запустить команду в cmd для создания файла точек графика.   -  person MadProgrammer    schedule 01.09.2016


Ответы (2)


Используя подсказку в этом вопросе: https://www.researchgate.net/post/Is_there_any_open_source_RD

Мне удалось построить график RDF, преобразовав его в график Networkx и используя инструменты построения графиков Networkx / Matplotlib.

import rdflib
from rdflib.extras.external_graph_libs import rdflib_to_networkx_multidigraph
import networkx as nx
import matplotlib.pyplot as plt

url = 'https://www.w3.org/TeamSubmission/turtle/tests/test-30.ttl'

g = rdflib.Graph()
result = g.parse(url, format='turtle')

G = rdflib_to_networkx_multidigraph(result)

# Plot Networkx instance of RDF Graph
pos = nx.spring_layout(G, scale=2)
edge_labels = nx.get_edge_attributes(G, 'r')
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)
nx.draw(G, with_labels=True)

#if not in interactive mode for 
plt.show()

Для визуализации больших графиков RDF может потребоваться некоторая тонкая настройка стиля ;-)

person Tom Hemmes    schedule 08.01.2019
comment
Интересно, что ваш ответ на пару лет новее вопроса. Интересно, что за это время изменилось или улучшилось. - person MadProgrammer; 10.03.2019
comment
Из истории RDFLib на GitHub кажется, что этот rdflib.extras.external_graph_libs.rdflib_to_networkx_multidigraph уже был доступен в то время, когда вы задали вопрос. Вы имеете в виду, что думаете, что в наши дни должно быть лучшее решение? - person Tom Hemmes; 10.03.2019
comment
Строка result = g.parse(url, 'ttl') у меня не работала. Аргумент формата не был распознан, и rdflib попытался проанализировать его как rdf / xml. Мне пришлось написать ключевое слово формата, а также использовать черепаху вместо ttl, чтобы заставить его работать. result = g.parse(url, format='turtle') - person Asahiko; 21.01.2020
comment
Я поместил метки краев из другого словаря, и мне понадобилось nx.draw(G, pos, with_labels=True), чтобы нарисовать их в позициях - person Lostefra; 27.06.2021

Я мог бы сделать изображение вашего RDF-графика с помощью rdf2dot, как вы предложили. Тем не менее я не полностью доволен этой библиотекой, поскольку она не создает узлов для литералов. Это мой код:

!pip install pydotplus
!pip install graphviz

import io
import pydotplus
from IPython.display import display, Image
from rdflib.tools.rdf2dot import rdf2dot

def visualize(g):
    stream = io.StringIO()
    rdf2dot(g, stream, opts = {display})
    dg = pydotplus.graph_from_dot_data(stream.getvalue())
    png = dg.create_png()
    display(Image(png))

visualize(g)

Получение следующего результата:  введите описание изображения здесь

person Christian Wartena    schedule 28.04.2020
comment
это кажется великолепным! Не могли бы вы рассказать, как воспроизвести этот результат, используя автономный ttl или (если возможно) конечную точку sparql? - person K3it4r0; 19.05.2020
comment
Я не понимаю, что ты имеешь в виду. Вы можете загружать график как хотите. Небольшой пример с RDF-фрагментом из стандартного введения в RDF. Если вы сначала загрузите ttl-данные в строку, например variabe ttlstring, вы можете получить график следующим образом: from rdflib import Graph, URIRef, Literal g = Graph () g.parse (data = ttlstring, format = 'черепаха'), а затем действуйте, как указано выше. Извините, я не могу получить здесь форматирование кода или новые строки. - person Christian Wartena; 20.05.2020