2015-01-15 6 views
1

Я знаю, что мне следует избегать использования внутреннего id в neo4j, но есть ли способ получить доступ к внутреннему идентификатору узла в neo4j и RETURN DISTINCT всех узлов на основе этого внутреннего идентификатора?Как получить доступ к внутреннему идентификатору узла neo4j?

Я попытался это:

  match (n) where id(n)=123 return n; 

Это вернуть мне узел с внутренним идентификатором = 123, но как я могу существовать все узлы в базе данных на основе внутреннего идентификатора?

ответ

4

Представьте себе следующее:

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; 

Но, будьте осторожны - это, скорее всего, болезненный/дорогостоящая операция для извлечения всех узлов, если график большой.

+0

Большое спасибо. Очень полезно! – user1919

+1

@dkar, никаких проблем - рад, если бы я мог помочь! – wassgren

1

Может быть только один узел за раз с заданным внутренним идентификатором. После удаления узла его внутренний идентификатор можно переназначить на новый узел, но не раньше этого.

Таким образом, ваш запрос может возвращать не более одного результата.

+0

Хорошо. Но я хочу сделать: RETURN DISTINCT (n.internalID). Мне нужно это, чтобы использовать его для моих данных, поскольку у них нет другого свойства, которое отличается. – user1919

+2

Не понимаю. Внутренний идентификатор присваивается БД, и единственный способ получить его от узла - через функцию ID(). Конечно, вы всегда можете добавить свое собственное свойство 'id' к узлу, но это не то же самое, что и« внутренний идентификатор »- вы не можете явно указать внутренний идентификатор. Если это не ясно, пожалуйста, предоставьте дополнительную информацию о вашей ситуации. – cybersam

+1

Возможно, путаница в том, что OP должен понимать, что внутренний идентификатор в базе данных ** не является свойством узла **. Поэтому вы не можете сказать «n.internalID» или что-то подобное. Вместо этого для его использования вы используете функцию ID(). – FrobberOfBits

Смежные вопросы