2015-07-26 39 views
7

Tôi đang truy vấn cơ sở dữ liệu Neo4j lưu trữ xây dựng floorpans. Ví dụ về truy vấn là:Giới hạn số lượng nút

MATCH (s:STOREYVERTEX) <-- (room0: LIVING) 
MATCH (s) <-- (room1: DINING) 
MATCH (s) <-- (room2: KITCHEN) 
MATCH (room0) - [edge0: DOOR] -> (room2) 
MATCH (room2) - [edge1: DOOR] -> (room1) 
RETURN s 

Bây giờ, điều này trả về tất cả các đồ thị có biểu đồ con tương ứng với các ràng buộc. Tôi muốn bằng cách nào đó giới hạn số lượng các nút mà đồ thị kết quả có, vì vậy cho ví dụ nhất định tôi muốn chỉ nhận được các đồ thị có chính xác 3 nút, tất cả các loại ROOM.

Có cách nào để thực hiện điều này trong Cypher không?

Edit: Something như thế này không hoạt động:

MATCH (s:STOREYVERTEX) <-- (rooms:ROOM) 
WITH s, count(distinct(rooms)) as numberOfRooms 
WHERE numberOfRooms = 3 
MATCH (s) <-- (room1: DINING) 
MATCH (s) <-- (room2: KITCHEN) 
MATCH (room0) - [edge0: DOOR] -> (room2) 
MATCH (room2) - [edge1: DOOR] -> (room1) 
RETURN s 
+0

hãy cố gắng sử dụng ngữ nghĩa có ý nghĩa mối quan hệ-loại trong truy vấn của bạn. –

+0

Bây giờ có ổn không? – Banana

Trả lời

0

gì cuối cùng giải quyết vấn đề của tôi là:

MATCH (s:STOREYVERTEX) <-- (rooms) 
WITH s, count(distinct(rooms)) as numberOfRooms 
WHERE numberOfRooms = 3 
MATCH (s) <-- (room1: KITCHEN) 
MATCH (s) <-- (room2: DINING) 
RETURN s 
3

Vâng, bạn có thể làm điều đó, như thế này:

MATCH (s:STOREYVERTEX) <-- (rooms:ROOM) 
WITH s, count(distinct(rooms)) as numberOfRooms 
WHERE numberOfRooms = 3 
RETURN s; 

này chỉ kiểm tra có bao nhiêu phòng khác nhau rõ rệt được kết nối với một STOREYVERTEX và chỉ trả về các giá trị s khi đó là 3.

Bạn không chỉ định số DOOR st uff là về trong truy vấn của bạn, nhưng bạn sẽ có thể sửa đổi truy vấn này từ đây để có được nơi bạn muốn đi.

+0

Vâng, tôi vừa sao chép toàn bộ truy vấn từ ứng dụng của tôi, nhưng trong DOOR câu hỏi cụ thể này không thực sự có liên quan. Cảm ơn nhiều! :) – Banana

+0

Hmm, vào suy nghĩ thứ hai, tôi không chắc đây là giải pháp cho tôi. Không phải tất cả các nút đều là ROOM. Tôi đã chỉnh sửa truy vấn một chút trong câu hỏi - vẫn có thể trong truy vấn như vậy để hạn chế kết quả chỉ với đồ thị có 3 nút, bất kể loại của chúng? – Banana

+0

Chỉ cần loại bỏ nhãn ROOM. – FrobberOfBits

1

Trước tiên, bạn có thể gắn nhãn tất cả các phòng là, tốt, PHÒNG. Vì vậy, khi bạn tạo một mới, ví dụ, nút bếp bạn sẽ đặt tên nó cả bếp và phòng:

CREATE (a:KITCHEN:ROOM {...}) 

Đối với bây giờ bạn có thể thêm các nhãn cho các nút hiện có như thế này:

MATCH (room:Kitchen) SET room :ROOM return room 

Xin chúc mừng, bây giờ tất cả các nút bếp của bạn cũng là các nút phòng!

Điều này cho phép bạn coi nút đó là nhà bếp, khi bạn cần nhà bếp hoặc phòng chung khi bạn cần. Nếu bạn làm điều đó cho phù hợp tất cả các nút (sống, ăn, ...) sau đó bạn có thể làm điều gì đó như:

MATCH (s:STOREYVERTEX)-[r]-(room: ROOM) 
    WITH s, count(r) as rel_count 
    WHERE rel_count = 3 
    RETURN s 

này sẽ trở lại với các nút 's' với 3 mối quan hệ (không có vấn đề gì loại rel là) đến bất kỳ nút nào có nhãn ROOM.

Các vấn đề liên quan