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 есть 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>. И результирующий график выглядит красивее
Наборы тегов, отношений и свойств можно увидеть в интерфейсе локального сервера Neo4j.
Вся кодовая база может быть найдена здесь в github .
Визуализация как GraphGist
Легкое представление может быть сделано в GraphGist. Я создал график этого XML.
Вот ссылка на суть . Кроме того, скрипт gist можно найти в github gist здесь …