Neo4J отримати вузол за ідентифікатором


84

Я використовую neo4j для одного зі своїх проектів, є вузол, який має лише одну властивість, оскільки nameя хочу отримати цей вузол за допомогою ідентифікатора, він вже має ідентифікатор, але коли я використовую цей код

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

Це нічого не повертає, ось мій вузол

введіть тут опис зображення

Якщо запит помилковий, то як я можу запитати його, використовуючи номер


Який інструмент візуалізації графіків ви використовуєте? Дякую. Я знаю про yworks.com/neo4j-explorer хороший варіант налаштування.
MyUserInStackOverflow

Відповіді:


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

IDФункція отримує вас ідентифікатор вузла або відносин. Це відрізняється від будь-якого властивості, що викликається idабо IDстворюється вами.


1
чи існує інший спосіб отримати такі дані (s: SomeLabel {id: 65110})?
DonkeyKong

@DonkeyKong Ні, оскільки ви також можете додати властивість id, яка є чимось іншим, ніж id. Властивість id може мати будь-який тип, тоді як вузол або край ідентифікатора - це ціле число без знака, пов’язане з розташуванням у внутрішній структурі Neo4J.
пвоостен

25
СТАНДАРТНА ВІДМОВА ПРО ВІДПОВІДАЛЬНІСТЬ: Не використовуйте внутрішні ідентифікатори Neo4j для довгострокової ідентифікації сутності. Майбутні версії Neo4j можуть міняти ці ідентифікатори з метою підвищення продуктивності. Створіть свою власну унікальну властивість ідентифікатора (в ідеалі з a CONSTRAINT) для відстежуючих осіб
Брайан Андервуд,

Додавання параграфа офіційної документації cypher, якщо хтось зацікавив: neo4j.com/docs/cypher-manual/current/clauses/match/…
Ziemowit

13

Попередження: Наступна відповідь неправильна! START слід використовувати лише при доступі до застарілих індексів . Він вимкнений у версії Cypher 2.2 і новіших версій .

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

Зберігаючи цю відповідь, щоб ніхто не допустив тієї ж помилки.

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

Існує більш ефективний спосіб зробити це:

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

Результати з ПОЯСНЕННЯ та ПРОФІЛЮ для простого запиту показали мені, що @Code мав рацію. Чому цього немає в документах?
Соната

@Sonata Яку версію ви використовуєте? Новіші версії Neo4j повинні зробити СТАРТ застарілим.
Codebling

3.0.7. Погляньте на Result Detailsці приклади в консолі: console.neo4j.org/r/dbz1we (робимо сканування AllNodesScan) і console.neo4j.org/r/9076wd (робимо NodeById)
Соната

@Sonata Я не впевнений, чому це відбувається. Перш за все, це не повинно працювати - у документах зазначено, що START застарілий як Cypher 2.0 та вимкнений як Cypher 2.2, але він, очевидно, все ще працює. По-друге, MATCH з ідентифікатором повинен мати +NodeByIdSeekдоступ лише до одного вузла, але з якихось причин він робить +AllNodesScan.
Codebling

4

ви можете сказати:

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.