null

Краткий экскурс в язык Cypher

Cypher представляет собой SQL-пободный открытый язык запросов к графовой СУБД Neo4j.

Основными элементами, которыми оперирует этот язык, являются вершины (ноды) и рёбра графа.

Рёбра в Neo4j имеют тип и направление, вершины же могут быть помечены одной или более метками, а так же могут иметь несколько дополнительных свойств. Для описания шаблонов извлекаемой информации в Cypher используется ASCII графика: 

  • Вершины записываются в виде пары круглых скобок, внутри которых задаются дополнительные условия, будь то тип выршины или значение какого-либо свойства, например (a:Actor) - вершина типа Actor.
  • Рёбра записываются в виде пары квадратных скобок, по аналогии с вершинами внутри скобок задаются доп условия. [e:ACTED] - связь типа ACTED.
  • Направление связи задаётся с помощью стрелок следующим образом:
    • ()-[]->()
    • ()<-[]-()
    • ()-[]-() - для случая, когда направление связи не важно
    • В случае, когда нет необходимости накладывать дополнительные ограничения на связи между вершинами, можно опустить квадратные скобки в указании связи: ()--()

Основными ключевыми словами для выборки информации являются:

  • MATCH - ключевое слово, после которого следует шаблон, описывающий искомую информацию
  • WHERE - ключевое слово, после которого можно добавить дополнительные ограничения, накладываемые на шаблон, либо отфильтровать результаты
  • RETURN - ключевое слово, определяющее что будет возвращено в результате выполнения запроса

Для понимая того, как это работает, воспользуемся примером.

Пусть у нас имеется следующий граф

 

Допустим, нам необходимо найти тех людей, которые имеют друзей и, при этом, сами являются для кого-то другом. Такой запрос будет выглядеть следующим образом:

MATCH ()-[:friend]->(person)-[:frined]->()
RETURN person;

В результате выполнения данного запроса мы получим следующих людей: Josh, Alex, Peter.

Либо нам необходимо найти людей, через которых John может связаться с Mike

MATCH (john{name:"John"})-[]-(person)-[]-((mike{name:"Mike"}))
RETURN person;

В этом случае мы воспользовались фигурными скобками, в которых указали необходимые значения свойства name.

Теперь найдём всех людей, которые являются родственниками

MATCH (a)-[:brother | :sister]-(b)
RETURN a, b;

 

Кроме того, Cypher имеет ряд встроенных функций для работы с графами, так например мы можем воспользовать функцией shortestPath для определения наименьшей цепочки знакомых от Peter до Mike 

MATCH path = shortestPath( (peter{name:"Peter"})-[relation*1..]->((mike{name:"Mike"})) )
RETURN path;

Либо

MATCH (peter{name:"Peter"})
MATCH (mike{name:"Mike"})
MATCH path = shortestPath( (peter)-[relation*1..]->(mike) )
RETURN path;

В это случае мы получим цепочку: Peter -> Josh -> Alex -> Mike

Как видно в одном запросе можно использовать несколько предложений MATCH для построения сложных шаблонов.

Запись [:type*a..b], где a и b - числа, позволяет задавать минимальную и максимальную длину цепочки. В случае, если b отсутствует, максимальная длина не ограничена.

С полным списком функций можно ознакомиться здесь

Добавим ограничение на тип отношения relation, сделать это можно с помощью ключевого слова WHERE

MATCH (peter{name:"Peter"})
MATCH (mike{name:"Mike"})
MATCH path = shortestPath( (peter)-[relation*1..]->(mike) )
WHERE ALL(rel in relation WHERE (TYPE(rel) = 'friend'))
RETURN path;

 

Для создания вершин и связей исльзуется предложение CREATE. Например для того, чтобы создать вершину Josh можно выполнить следующий запрос

MATCH (peter{name:"Peter"})
MATCH (mike{name:"Mike"})
CREATE (peter)-[:friend]->( {name:Josh} )-[:friend]->(mike);

 

На этом, краткий обзор языка Cypher можно завершить. Для детального изучения возможностей данного языка можно создать собственную базу данных и практиковать различные операции и писать сложные запросы.