2015-07-26 5 views
7

Я запрашиваю базу данных Neo4j, в которой хранятся строительные плиты. Пример запроса:Ограничение количества узлов

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 

Теперь это возвращает все графики, которые имеют подграф, соответствующий ограничениям. Я хотел бы как-то ограничить количество узлов, которые имеет граф результатов, поэтому для данного примера я хотел бы получить только графики, которые имеют ровно 3 узла, все типа ROOM.

Есть ли способ сделать это в Cypher?

Edit: Что-то вроде этого не работает:

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

пожалуйста, попробуйте использовать семантически значимые отношения-типы в запросе. –

+0

Теперь все в порядке? – Banana

ответ

0

Что, наконец, решить мою проблему было:

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

Да, вы можете сделать это, например:

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

Это просто проверяет, сколько различных разные номера подключены к STOREYVERTEX, и возвращает только значения s, где это 3.

Вы не указали, что такое DOOR st uff был в вашем запросе, но вы должны иметь возможность изменить этот запрос отсюда, чтобы получить, куда вы хотите пойти.

+0

Да, я просто скопировал весь запрос из своего приложения, но в этом конкретном вопросе DOOR действительно не актуальна. Огромное спасибо! :) – Banana

+0

Хм, с другой стороны, я не уверен, что это решение для меня. Не все узлы являются НОМЕРАМИ. Я немного изменил вопрос в вопросе - возможно ли в таком запросе ограничить результаты только графиком с 3 узлами, независимо от их типа? – Banana

+0

Просто снимите метку ROOM. – FrobberOfBits

1

Прежде всего, вы можете пометить все номера, как, ну, КОМНАТА. Так что, когда вы создаете новый, например, кухонный узел вы маркировать его как кухня и комната:

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

На данный момент вы можете добавить ярлыки к существующим узлам, как это:

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

Congratz, теперь все ваши кухонные узлы также являются узлами комнаты!

Это позволяет обрабатывать этот узел как кухню, когда вам нужны кухни, или как общая комната, когда вам это нужно. Если вы сделаете это для соответствующих всех узлов (гостиная, столовая, ...) вы могли бы сделать что-то вроде:

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

Это будет возвращать узлы «S» с 3-х отношений (независимо от того, какой тип отн) к любому узлу с меткой ROOM.