Neo4J nhận nút theo ID


84

Tôi đang sử dụng neo4j cho một trong những dự án của mình, có một nút chỉ có một thuộc tính duy nhất là name, tôi muốn lấy nút đó bằng ID, nó đã có ID nhưng khi tôi sử dụng mã này

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

Nó không trả về gì cả, đó là nút của tôi

nhập mô tả hình ảnh ở đây

Nếu truy vấn sai thì làm cách nào để truy vấn bằng số


Bạn sử dụng công cụ trực quan hóa đồ thị nào? Cảm ơn. Tôi biết về tùy chọn tốt yworks.com/neo4j-explorer để tùy chỉnh.
MyUserInStackOverflow

Câu trả lời:


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

Các IDchức năng giúp bạn id của một nút hoặc mối quan hệ. Điều này khác với bất kỳ thuộc tính nào được gọi idhoặc IDmà bạn tạo.


1
có cách nào khác để lấy dữ liệu như (s: SomeLabel {id: 65110}) không?
DonkeyKong

@DonkeyKong Không, vì bạn cũng có thể thêm thuộc tính id, thuộc tính này khác với id. Thuộc tính id có thể có bất kỳ kiểu nào, trong khi id nút hoặc cạnh là một số nguyên không dấu, được liên kết với một vị trí trong cấu trúc bên trong của Neo4J.
pvoosten

25
KHUYẾN CÁO TIÊU CHUẨN: Không sử dụng ID Neo4j nội bộ để nhận dạng thực thể lâu dài. Các phiên bản tương lai của Neo4j có thể thay đổi các ID này cho các mục đích hiệu suất. Tạo thuộc tính ID duy nhất của riêng bạn (lý tưởng là với a CONSTRAINT) để theo dõi các thực thể
Brian Underwood

Thêm đoạn tài liệu chính thức của cypher nếu ai đó quan tâm: neo4j.com/docs/cypher-manual/current/clauses/match/...
Ziemowit Stolarczyk

13

Cảnh báo: Câu trả lời sau đây không chính xác! START chỉ nên được sử dụng khi truy cập các chỉ mục kế thừa . Nó bị tắt trong Cypher 2.2 trở lên .

Neo4j khuyên bạn nên sử dụngWHERE ID(n) = và hơn nữa nói rằng nó sẽ chỉ yêu cầu một lần tra cứu duy nhất (không quét mọi nút để tìm ID phù hợp)

Giữ câu trả lời này để tránh bất kỳ ai mắc phải sai lầm tương tự.

Bạn có thể sử dụng WHERE ID(s) = 65110, nhưng điều này sẽ kiểm tra ID của mọi nút trong cơ sở dữ liệu của bạn.

Có một cách hiệu quả hơn để làm điều này:

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

Kết quả từ EXPLAIN và PROFILE cho một truy vấn đơn giản cho tôi thấy rằng @Code đã đúng. Tại sao điều này không có trong tài liệu?
Sonata

@Sonata Bạn đang chạy phiên bản nào? Các phiên bản mới hơn của Neo4j sẽ khiến START trở nên lỗi thời.
Viết mã

3.0.7. Hãy xem Result Detailstừ các ví dụ này trong bảng điều khiển: console.neo4j.org/r/dbz1we (thực hiện AllNodesScan) và console.neo4j.org/r/9076wd (thực hiện NodeById)
Sonata

@Sonata Tôi không chắc tại sao điều này lại xảy ra. Trước hết, nó sẽ không hoạt động - tài liệu nói rằng START không được chấp nhận đối với Cypher 2.0 và bị vô hiệu hóa đối với Cypher 2.2, nhưng rõ ràng nó vẫn hoạt động. Thứ hai, MATCH với ID chỉ nên +NodeByIdSeektruy cập 1 nút nhưng vì lý do nào đó mà nó đang thực hiện +AllNodesScan.
Viết mã

4

bạn có thể nói:

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

điều này sẽ trả về tất cả các nút thuộc loại Người dùng có ID tham chiếu nút hơn 20

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.