Представьте себе следующее:
CREATE (:SomeLabel {myId:123})-[:someRelationshipType]->(:SomeLabel {myId:456})
Это создаст два узел с отношениями между ними. Отношение имеет тип someRelationshipType
.
Итак, что произойдет, если вы выполните следующий запрос?
MATCH
(s:SomeLabel)-[rel:someRelationshipType]->(target:SomeLabel)
RETURN
ID(s), // Built-in Neo4j function to retrieve the internal node id
s.myId, // Access the property myId that you created above
LABELS(s), // Lists all labels for the start node
ID(rel), // Built-in Neo4j function to retrieve the internal relationship id
TYPE(rel), // Built-in Neo4j function to retrieve the relationship type
ID(target), // Built-in Neo4j function to retrieve the internal node id
target.myId // Access the property myId that you created above
Выход запроса что-то вроде:
ID(root) | root.myId | LABELS(root) | ID(rel) | TYPE(rel) | ID(target) | target.myId
-----------------------------------------------------------------------------------------------
192 | 123 | SomeLabel | 271 | someRelationshipType | 193 | 456
Это показывает несколько интересных вещей. Во-первых, есть несколько встроенных функций, которые возвращают значения, которые вы не предоставили себе. Функция ID()
возвращает внутренний идентификатор узла или отношение. Это сгенерированный идентификатор, который вы не можете контролировать самостоятельно, он полностью обрабатывается базой данных (и ее можно даже повторно использовать, поэтому вы не можете действительно полагаться на эти значения). Каждый узел имеет точно один внутренний идентификатор, и он уникален во всей базе данных, поэтому вы не можете найти несколько узлов с одним и тем же внутренним идентификатором.
Но в запросе выше есть также свойство, называемое myId
. Могут быть несколько узлов, которые на самом деле имеют одинаковое значение для этого свойства, поскольку это свойство, которое мы создали сами. Единственный способ убедиться, что эти свойства содержат уникальные значения, заключается в использовании UNIQUE
-constraint (see the docs here).
Уникальные ограничения могут быть установлены, используя следующий синтаксис:
CREATE CONSTRAINT ON (n:SomeLabel) ASSERT n.myId IS UNIQUE
другими функциями, которые являются частью оригинального MATCH
-query являются:
LABELS
- возвращает список всех labels, которые часть узла
TYPE
- возвращает тип отношения, который был задан при создании узла.
Последнее замечание, если вы хотите заполучить все узлы графа вы можете использовать следующий запрос:
MATCH (n) RETURN n;
Но, будьте осторожны - это, скорее всего, болезненный/дорогостоящая операция для извлечения всех узлов, если график большой.
Большое спасибо. Очень полезно! – user1919
@dkar, никаких проблем - рад, если бы я мог помочь! – wassgren