Статьи

Навигация по XML с использованием Cypher

Cypher  — это отличный способ манипулировать базой данных Neo4j. Было бы одинаково удивительно, если бы  график Xml  можно было также запрашивать с помощью Cypher.

Честно говоря, я должен отдать должное  Майклу  за предложение такой возможности здесь ..

Что ж, начнем с простого XML-файла.

<library>
<author firstname="Earnest" lastname="Hemingway">
<works>
<book name="A Farewell to Arms" year="1929" />
<book name="For Whom the bell tolls" year="1940" />
<book name="The Old man and the sea" year="1951" />
</works>
<awards>
<award name = "Pulitzer Prize" category="Fiction" year="1953"></award>
<award name = "Nobel Prize" category="Literature" year="1954"></award>
</awards>
</author>
<author firstname="Victor" lastname="Hugo">
<works>
<book name="The Hunchback of Notre-Dame" year="1831" />
<book name="Les Misérables" year="1862" />
</works>
</author>
</library>

Это простой xml, в котором нет ничего особенного. Как объяснялось в предыдущих постах  здесь  и  здесь .. Из этого можно сделать аккуратный график neo4j…

Снимок экрана от 2014-07-22 21:16:46

Итак, давайте перейдем к обходу этого графа с использованием  Cypher . И поскольку мы пытаемся пройти по XML, давайте сделаем грубое сравнение с  XPath .

Давайте выберем все узлы книги,

Xpath для получения всех узлов книги, независимо от того, где они находятся в документе,

//книга

Для той же цели запрос Cypher будет,

MATCH (books:book) RETURN books

Это приведет к следующему выводу для приведенного выше графика,

bookNodes

Давайте теперь попробуем получить название всех книг. XPath потребует лишь небольшой модификации,

// Книга / @ имя

XPath вернет список как,

Attribute='name="A Farewell to Arms"'
Attribute='name="For Whom the bell tolls"'
Attribute='name="The Old man and the sea"'
Attribute='name="The Hunchback of Notre-Dame"'
Attribute='name="Les Misérables"'

Сайферу потребуется только небольшая модификация. Вместо того, чтобы возвращать весь узел, извлеките атрибут «name» для узлов.

MATCH (books:book) RETURN books.name

BookNameДалее, давайте запросим награды, присужденные Эрнесту Хемингуэю,

Это может быть достигнуто через XPath как,

// автор [@ Firstname = ‘Убедительная’] / награды

который дает выход

<awards>
 <awardname="Pulitzer Prize"category="Fiction"year="1953"/>
 <awardname="Nobel Prize"category="Literature"year="1954"/>
</awards>

Что касается Сайфера,

MATCH (author {firstname: “Earnest”})-[*]->(award:award) RETURN award

Мы пытаемся получить любой узел типа  «вознаграждение»,  связанный с узлом типа  «автор»  с firstname = Earnest

награды