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…
Итак, давайте перейдем к обходу этого графа с использованием Cypher . И поскольку мы пытаемся пройти по XML, давайте сделаем грубое сравнение с XPath .
Давайте выберем все узлы книги,
Xpath для получения всех узлов книги, независимо от того, где они находятся в документе,
//книга
Для той же цели запрос Cypher будет,
MATCH (books:book) RETURN books
Это приведет к следующему выводу для приведенного выше графика,
Давайте теперь попробуем получить название всех книг. 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
Далее, давайте запросим награды, присужденные Эрнесту Хемингуэю,
Это может быть достигнуто через 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 …