Neo4J pobiera węzeł przez ID


84

Używam neo4j w jednym z moich projektów, istnieje węzeł, który ma tylko jedną właściwość, ponieważ namechcę uzyskać ten węzeł za pomocą identyfikatora, ma już identyfikator, ale kiedy używam tego kodu

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

Nic nie zwraca, oto mój węzeł

wprowadź opis obrazu tutaj

Jeśli zapytanie jest błędne, w jaki sposób mam je sprawdzić, używając numeru


Z jakiego narzędzia do wizualizacji wykresów korzystasz? Dzięki. Znam yworks.com/neo4j-explorer dobrą opcję dostosowywania.
MyUserInStackOverflow,

Odpowiedzi:


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

IDFunkcja dostaje identyfikator węzła lub stosunku. Różni się to od wszelkich właściwości o nazwie idlub IDtworzonych przez Ciebie.


1
czy istnieje inny sposób uzyskiwania danych, takich jak (s: SomeLabel {id: 65110})?
DonkeyKong

@DonkeyKong Nie, ponieważ możesz również dodać właściwość id, która jest czymś innym niż id. Właściwość id może mieć dowolny typ, podczas gdy identyfikator węzła lub krawędzi jest liczbą całkowitą bez znaku, połączoną z lokalizacją w wewnętrznej strukturze Neo4J.
pvoosten

25
STANDARDOWE ZASTRZEŻENIE: Nie używaj wewnętrznych identyfikatorów Neo4j do długoterminowej identyfikacji jednostki. Przyszłe wersje Neo4j mogą zmienić te identyfikatory ze względu na wydajność. Utwórz własną unikalną usługę identyfikacyjną (najlepiej z a CONSTRAINT) do śledzenia obiektów
Brian Underwood,

Dodanie akapitu oficjalnej dokumentacji cyphera
Ziemowit Stolarczyk

13

Ostrzeżenie: poniższa odpowiedź jest nieprawidłowa! START należy używać tylko w przypadku uzyskiwania dostępu do starszych indeksów . Jest wyłączony w Cypher 2.2 i nowszych .

Neo4j zaleca używanieWHERE ID(n) = , a ponadto stwierdza, że będzie wymagało tylko jednego wyszukiwania (nie skanuje każdego węzła, aby znaleźć pasujący identyfikator)

Zachowaj tę odpowiedź, aby zapobiec popełnieniu tego samego błędu.

Państwo może używać WHERE ID(s) = 65110, ale będzie to sprawdzić identyfikator każdego węzła w bazie danych.

Jest na to bardziej efektywny sposób:

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

Wyniki z EXPLAIN i PROFILE dla prostego zapytania pokazały mi, że @Code miał rację. Dlaczego nie ma tego w dokumentacji?
Sonata

@Sonata Jakiej wersji używasz? Nowsze wersje Neo4j powinny uczynić START przestarzałym.
Codebling

3.0.7. Spójrz na Result Detailste przykłady w konsoli: console.neo4j.org/r/dbz1we (wykonując AllNodesScan) i console.neo4j.org/r/9076wd (wykonując NodeById)
Sonata

@Sonata Nie jestem pewien, dlaczego tak się dzieje. Przede wszystkim nie powinno działać - dokumentacja stwierdza, że ​​START jest przestarzały od Cyphera 2.0 i wyłączony od Cyphera 2.2, ale najwyraźniej nadal działa. Po drugie, MATCH z ID powinno być +NodeByIdSeekdostępem tylko do jednego węzła, ale z jakiegoś powodu robi +AllNodesScan.
Codebling

4

możesz powiedzieć:

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

zwróci to wszystkie węzły typu User z identyfikatorem odniesienia węzła większym niż 20

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.