Neo4j node тип недвижимости

Я играю с neo4j, и мне было интересно, общепринято ли иметь свойство type на узлах, которые указывают, какой тип Node он есть? Я попытался найти эту практику, и я видел, как некоторые люди использовали name для такой цели, но мне было интересно, считалось ли это хорошей практикой или если бы индексы были более практичным методом?

Примером может быть "Пользователь" node, который имел бы тип: user, таким образом, если индекс был плохим, я мог бы выполнить проверку all-node и искать типы user.

Ответ 1

Правда, это зависит от вашего варианта использования.  Если вы добавите свойство типа, а затем хотите найти всех пользователей, то у вас появятся потенциальные проблемы, так как вы должны изучить это свойство на каждом node, чтобы добраться до пользователей. В этом случае индекс, вероятно, будет лучше, но не в тех случаях, когда вам нужно запрашивать для всех пользователей условия и отношения, недоступные в индексе (если, конечно, ваш индекс не является источником "начала" ). Если у вас есть такие графики, как my, где тип отношения подразумевает два разных типа node, такие как A- (знает) - (B), а A или B могут быть пользователем или клиентом, тогда это не сработает.

Таким образом, ваш прецедент действительно важен - легко моделировать графики в целом, но важно "настроить" его в соответствии с вашим шаблоном использования.

Ответ 2

Labels были добавлены в neo4j 2.0. Они исправляют эту проблему.

Вы можете создавать узлы с метками:

CREATE (me:American {name: "Emil"}) RETURN me;

Вы можете сопоставлять метки:

MATCH (n:American)
WHERE n.name = 'Emil'
RETURN n

Вы можете установить любое количество меток на node:

MATCH (n)
WHERE n.name='Emil'
SET n :Swedish:Bossman
RETURN n

Вы можете удалить любое количество меток на node:

MATCH (n { name: 'Emil' })
REMOVE n:Swedish

Etc...

Ответ 3

IMHO вам не нужно класть свойство типа на node. Вместо этого, общий способ ссылаться на все узлы конкретного "типа" - это, возможно, подключение всех пользовательских узлов к node, называемому "Пользователи". Таким образом, начиная с Users node, вы можете легко найти все пользовательские узлы. Сам "Пользователи" node может быть проиндексирован, чтобы вы могли легко найти его, или его можно подключить к ссылке node.

Ответ 4

Я думаю, это действительно зависит от вас. Некоторые люди любят индексированные атрибуты типа, но я считаю, что они в основном полезны, когда у вас есть другие индексированные атрибуты, чтобы сузить количество обращений к индексу (например, для всех пользователей старше 21 года).

Тем не менее, как отмечает @Luanne, большинство из нас сначала пытается решить проблему в графике. Другой способ сделать это (и более естественным способом, на мой взгляд) - использовать тип отношения для вывода практического типа node, то есть "A - (знает) → B", поэтому A должен быть пользователем или некоторые другие вещи, которые могут "знать", а B должен быть другим пользователем, темой или другим объектом, который может быть "известен".

Ответ 5

Для клиентских API, моделирование типа элемента как свойства упрощает создание объекта правильного домена в вашем клиентском коде, поэтому я всегда включаю свойство типа в каждую node/vertex.

Обычно для этого используется имя var типа типа, но на некоторых языках, таких как Python, "type" является зарезервированным словом, поэтому я использую "element_type" в Bulbs (http://bulbflow.com/quickstart/#models).

Это не нужно для отношений edge/relations, поскольку они уже содержат тип (метку) - обратите внимание, что Neo4j также использует ключевое слово "type" вместо метки для отношений.

Ответ 6

Я бы сказал, что это обычная практика. В качестве примера, это точно как Spring Data Neo4j знает, какой тип сущности имеет определенный node. Каждый node имеет свойство type ", которое содержит квалифицированное имя класса объекта. Эти свойства автоматически индексируются в индексе типы, поэтому узлы можно быстро найти. Вы можете реализовать свой вариант использования именно так.