8.5.4 Задание свойств
Узлы и связи являются фундаментальными структурами в графе. Neo4j использует свойства как тех, так и других, позволяя строить намного более богатые модели.
Свойства могут быть выражены в образце с помощью такой структуры отображения: в фигурных скобках произвольное число пар ключ-значение, разделенных запятыми. Например, узел a с двумя свойствами выглядел бы так: (a { name: "Andres", sport:"Brazilian Ju-Jitsu" }).
Связь с ожиданиями могла бы выглядеть так:
(a)-[{blocked:false}]->(b)
Когда свойства появляются в образце, они вносят дополнительное ограничение к форме данных. В случае предложения CREATE свойства будут установлены для вновь создаваемых узлов и отношений. В случае предложения MERGE свойства будут использоваться как дополнительные ограничения на форму, которую должны иметь любые существующие данные (заданные свойства должны точно соответствовать любым существующим данным в графе). Если никаких соответствующих данных не найдено, MERGE ведёт себя как CREATE, и эти свойства будут установлены для вновь создаваемых узлов и связей.
Отметим, что образцы, используемые с CREATE, могут использовать единственный параметр для задания свойств, например: CREATE (node {paramName}). Это не допускается в образцах, используемых в других предложениях, т.к. Cypher необходимо знать имена свойств на этапе компиляции запроса, чтобы сопоставление было эффективным.
8.5.5 Описание связей
Простейший способ описания связи – использование стрелки между двумя узлами, как это делалось в предыдущих примерах. С помощью этой техники вы можете описать, что связь должна существовать и её направление. Если вас не заботит направление связи, наконечник связи можно опустить, например, так:
(a)--(b)
Как и узлам, отношениям также могут быть даны имена. В этом случае используется пара квадратных скобок с идентификатором между ними, которые разбивают стрелку надвое. Например:
(a)-[r]->(b)
Подобно меткам узлов, отношения могут иметь типы. Для описания связи заданного типа можно поступить следующим образом:
(a)-[r:REL_TYPE]->(b)
В отличие от меток, связи могут иметь только один тип. Однако если вы захотите описать некие данные, для которых связь должна иметь какой-нибудь один тип из набора, то они все могут быть перечислены в образце с разделяющим символом «|» как в этом примере:
(a)-[r:TYPE1|TYPE2]->(b)
Отметим, что данная форма образца может быть испольщована только для описания существующих данных (т.е. при использовании образца с MATCH или в качестве выражения). Она не будет работать с CREATE или MERGE, поскольку невозможно создать связь с множественными типами.
Как и для узлов, имя связи всегда может быть опущено, например:
(a)-[:REL_TYPE]->(b)