限制节点数量

时间:2015-07-26 16:22:59

标签: neo4j cypher

我正在查询存储建筑物底层的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中做到这一点?

编辑: 这样的事情不起作用:

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

3 个答案:

答案 0 :(得分:3)

是的,你可以这样做:

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

这只会检查有多少个不同的房间与STOREYVERTEX相关联,并且只会返回s个值的位置。

您没有在查询中指定DOOR内容的内容,但您应该可以从此处修改此查询以获取您想去的地方。

答案 1 :(得分:1)

首先,您可以将所有房间标记为房间。 因此,当您创建一个新的厨房节点时,您可以将它标记为KITCHEN和ROOM:

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

现在您可以将标签添加到现有节点,如下所示:

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

恭喜,现在你所有的厨房节点都是房间节点!

这使您可以在需要厨房时将该节点视为厨房,或在需要时将其视为普通房间。 如果您为相关的所有节点(生活,餐饮......)执行此操作,您可以执行以下操作:

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

这将返回具有3个关系的节点''(无论rel类型是什么)到任何标签为ROOM的节点。

答案 2 :(得分: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