Статьи

Визуализация XML как графика с использованием Neo4j

Neo4j  очень хорош для  всего . Вот выдержка, которую я нашел из  этого  блога

Всякий раз, когда кто-то ставит вам проблему,  думайте о графиках . Они являются наиболее фундаментальным и гибким способом представления любого вида отношений, так что примерно в 50-50 случаях любая интересная проблема дизайна включает в себя график. Убедитесь, что вы не можете придумать способ решить его с помощью графиков, прежде чем переходить к другим типам решений.

В качестве детского шага, давайте попробуем визуализировать XML как график.

Мы можем начать с простого XML здесь,

<?xmlversion="1.0"encoding="UTF-8"?>
 <breakfast_menu>
  <food>
   <nameattr="one">Belgian Waffles</name>
   <price>$5.95</price>
   <description>Two of our famous Belgian Waffles with plenty of real maple syrup</description>
   <calories>650</calories>
  </food>
 </breakfast_menu>

Это простое  «Меню завтрака», состоящее  только из одного блюда, « Бельгийские вафли ».

Neo4j  имеет удобный интерфейс, который позволяет нам визуализировать график, который мы создали. График для приведенного выше XML выглядит гладко ..

мал-граф-XML

В приведенном выше XML есть 6 тегов, и у нас есть 6 узлов на нашем графике. Вложенные теги / узлы имеют отношение  CHILD-OF  к родительскому тегу / узлу.

На приведенном выше графике

  • Узел с номером 0 является корневым узлом — соответствует тегу <Breakfast_menu>
  • Узел с номером 1 является непосредственным потомком корня — соответствует тегу <food>
  • Узлами с номерами от 2 до 4 являются теги, которые находятся под тегом <food>, а именно: <имя>, <цена>, <описание> и <калории>

Преобразование XML ..

Давайте разберем xml в структуру данных, которая может быть легко сохранена с помощью Neo4j . Лично я бы предпочел  парсер SAX, так  как при создании объекта DOM существуют серьезные ограничения памяти (очень больно, если вы говорите большие данные в формате xml). Кроме того, SAX-разбор дает вам неограниченную свободу делать все, что вы хотите делать с XML.

Вот как я представляю узел, используя объект  XmlElement . Каждый  XmlElement идентифицируется идентификатором. Это в основном целое или длинное. Единственное, что нужно убедиться, это то, что число должно быть уникальным для всех элементов XMLE.

publicclassXmlElement {
 
privateString tagName;
privateString tagValue;
privateMap<String, String> attributes = newHashMap<String,String>();
privateHierarchyIdentifier hierarchyIdentifier;
privateintparentId;
privatebooleanpersisted;
 
//Setters and Getters for the members
 
publicString getAtrributeString(){
 ObjectMapper jsonMapper = newObjectMapper();
 try{
  returnjsonMapper.writeValueAsString(this.attributes);
 } catch(JsonProcessingException e) {
  LOGGER.severe(e.getMessage());
  e.printStackTrace();
 }
 returnnull;
}
 
}

Имя и значение тега XML хранятся в виде строки, а атрибуты — в виде карты. Также есть еще один член Object, HierarchyIdentifier

publicclassHierarchyIdentifier {
 privateintdepth;
 privateintwidth;
 privateintid;
 
 //Getters and Setters for member element
}

Класс HierarchyIdentifier содержит класс id, который используется для идентификации XmlElement , что означает идентификацию тега XML. Каждый  XmlElement  хранит идентификатор своего родителя.

А после анализа XML должен быть представлен в виде карты <Integer, XmlElement > и каждого  XmlElement,  идентифицированного соответствующим целочисленным идентификатором. Вы можете увидеть SAX PARSER  здесь ..

Итак, мы передаем карту в   объект GraphWriter .

Мы создаем узел со следующими свойствами

  • Значение — значение тега XML
  • ID — идентификатор текущего узла
  • Родитель — идентификатор родительского тега
  • Атрибуты — строковое представление атрибутов тега

Кроме того, узел имеет следующие метки

  • УЗЕЛ — Для всех узлов
  • PARENT — для начального (верхнего родительского) узла
  • Имя тега XML — скажем, узел для тега <food> будет иметь метку FOOD

В настоящее время существует только один тип отношений, ‘CHILD_OF’, между непосредственными вложенными тегами.

Смотрите ниже пример для большего XML

<breakfast_menu>
 <food>
  <nameattr="one">Belgian Waffles</name>
  <price>$5.95</price>
  <description>Two of our famous Belgian Waffles with plenty of real maple syrup</description>
  <calories>650</calories>
 </food>
 <food>
  <nameattr="two">Masala Dosa</name>
  <price>$10.95</price>
  <description>South India's famous slim pancake with mashed potatoes</description>
  <calories>650</calories>
  <eaten>
   <namefirst="nikhil"/>
   <age>25</age>
  </eaten>
 </food>
</breakfast_menu>

Я добавил второй пункт в меню «Breakfast_Menu» …  легендарную масалу досу .

Кроме того, у второго элемента питания есть новый дочерний тег <eaten>. И результирующий график выглядит красивее

XML-мед

Наборы тегов, отношений и свойств можно увидеть в интерфейсе локального сервера Neo4j.

XML-мед-теги

Вся кодовая база может быть найдена здесь в  github .

Визуализация как  GraphGist

Легкое представление может быть сделано в GraphGist. Я создал график  этого  XML.

Вот ссылка на  суть . Кроме того, скрипт gist можно найти в github gist здесь