【问题标题】:Limiting number of nodes限制节点数量
【发布时间】:2015-10-16 19:42:37
【问题描述】:

我正在查询存储建筑地板的 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

【问题讨论】:

  • 请尝试在您的查询中使用语义上有意义的关系类型。

标签: neo4j cypher


【解决方案1】:

最终解决我的问题的是:

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

【讨论】:

    【解决方案2】:

    首先,您可以将所有房间标记为 ROOM。 因此,当您创建一个新的(例如,厨房)节点时,您可以将其标记为 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 类型是什么)的节点 's' 返回到带有标签 ROOM 的任何节点。

    【讨论】:

      【解决方案3】:

      是的,你可以这样做,像这样:

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

      这只是检查有多少不同的房间连接到STOREYVERTEX,并且只返回s 的值为3。

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

      【讨论】:

      • 是的,我刚刚从我的应用程序中复制了整个查询,但在这个特定问题中,DOOR 并不真正相关。非常感谢! :)
      • 嗯,再想想,我不确定这是否适合我。并非所有节点都是 ROOM。我在问题中稍微编辑了查询 - 在这样的查询中是否仍然可以将结果限制为仅具有 3 个节点的图形,无论它们的类型如何?
      • 去掉 ROOM 标签即可。
      • 我再次编辑了问题,向您展示我真正想要的。给定的查询不起作用,但这是我想进入的方向。如果我没有设法提出正确的问题,我很抱歉,我对 Cypher 很陌生。
      猜你喜欢
      • 2016-12-28
      • 2020-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-13
      • 2022-09-24
      • 2019-09-14
      相关资源
      最近更新 更多