Neo4J получает узел по ID


85

Я использую neo4j для одного из своих проектов, есть узел, который имеет только одно свойство, так как nameя хочу получить этот узел с помощью идентификатора, у него уже есть идентификатор, но когда я использую этот код

MATCH (s:SKILLS{ID:65110}) return s

Он ничего не возвращает, вот мой узел

enter image description here

Если запрос неверен, как мне запросить его, используя номер


Какой инструмент визуализации графиков вы используете? Благодарю. Я знаю yworks.com/neo4j-explorer хороший вариант для настройки.
MyUserInStackOverflow

Ответы:


140
MATCH (s)
WHERE ID(s) = 65110
RETURN s

IDФункция получает вас идентификатор узла или отношений. Это отличается от любого названного idили IDсозданного вами свойства .


1
есть ли другой способ получить данные вроде (s: SomeLabel {id: 65110})?
DonkeyKong

@DonkeyKong Нет, потому что вы также можете добавить свойство id, которое не является идентификатором. Свойство id может иметь любой тип, в то время как идентификатор узла или края - это целое число без знака, связанное с местоположением во внутренней структуре Neo4J.
pvoosten

25
СТАНДАРТНЫЙ ОТКАЗ: Не используйте внутренние идентификаторы Neo4j для долгосрочной идентификации сущностей. В будущих версиях Neo4j эти идентификаторы могут быть изменены в целях повышения производительности. Создайте свой собственный уникальный идентификатор (в идеале с a CONSTRAINT) для отслеживания объектов
Брайан Андервуд,

Добавление параграфа официальной документации cypher, если кому-то интересно: neo4j.com/docs/cypher-manual/current/clauses/match/…
Ziemowit Stolarczyk

13

Предупреждение: следующий ответ неверен! START следует использовать только при доступе к устаревшим индексам . Он отключен в Cypher 2.2 и выше .

Neo4j рекомендует использоватьWHERE ID(n) = и, кроме того, заявляет, что для этого потребуется только один поиск (не сканирует каждый узел, чтобы найти соответствующий идентификатор)

Сохраните этот ответ, чтобы никто не совершил ту же ошибку.

Вы можете использовать WHERE ID(s) = 65110, но это проверит идентификатор каждого узла в вашей базе данных.

Есть более эффективный способ сделать это:

START s=NODE(517) MATCH(s) RETURN s

Результаты EXPLAIN и PROFILE для простого запроса показали мне, что @Code был правильным. Почему этого нет в документации?
Соната

@Sonata Какая у вас версия? Более новые версии Neo4j должны сделать START устаревшим.
Codebling 02 дек.16,

3.0.7. Взгляните на Result Detailsэти примеры в консоли: console.neo4j.org/r/dbz1we (выполнение AllNodesScan) и console.neo4j.org/r/9076wd (выполнение NodeById)
Sonata

@Sonata Я не понимаю, почему это происходит. Прежде всего, это не должно работать - в документации указано, что START устарел в Cypher 2.0 и отключен в Cypher 2.2, но явно все еще работает. Во-вторых, MATCH с ID должен иметь +NodeByIdSeekдоступ только к 1 узлу, но по какой-то причине он выполняет +AllNodesScan.
Codebling 02

4

ты можешь сказать:

(n:User) where id(n) >=20 RETURN n

это вернет все узлы типа User с идентификатором ссылки на узел больше 20

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.