我正在查询存储建筑物底层的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
答案 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