【问题标题】:Neo4j All permutations where node type is distinct in eachNeo4j 中节点类型不同的所有排列
【发布时间】:2022-10-01 21:59:52
【问题描述】:

我想要做的是生成节点集合的所有排列,但是每个节点类型在每个排列中只出现一次。

例如,如果我有一个 u:User、l:Location、d:Device 节点的图表,假设每种类型有 3 个节点。

我希望能够生成的是一个可能看起来像这样的集合

User ID: 1, Location ID: 1
User ID: 1, Location ID: 2
User ID: 1, Location ID: 3
User ID: 1, Device ID: 1
User ID: 1, Device ID: 2
User ID: 1, Device ID: 3
User ID: 1, Location ID: 1, Device ID: 1
User ID: 1, Location ID: 1, Device ID: 2
User ID: 1, Location ID: 1, Device ID: 3
User ID: 1, Location ID: 2, Device ID: 1
User ID: 1, Location ID: 2, Device ID: 2
User ID: 1, Location ID: 2, Device ID: 3

依此类推,直到我拥有所有组合。

我不希望发生的情况是一个有效的组合不止一次地包含任何节点类型,因此一个组合只能有一个用户、一个位置和一个设备。

目前我正在使用 apoc.coll.combinations,但我似乎无法找到一种方法来阻止它使节点类型不同。

如果我要跑

MATCH (l:Location)-[]-(d:Device)-[]-(ur:User)
WITH COLLECT({l:l,ur:ur}) as coll
WITH apoc.coll.combinations(coll,1,size(coll)) as combColl
RETURN combColl

我会用完内存,因为有效的组合将是所有位置和所有用户风险。

【问题讨论】:

    标签: database neo4j cypher


    【解决方案1】:

    您需要使用 apoc.coll.combinations 为每个位置、设备和用户获取一个项目组合。然后执行 UNWIND 以组合每个项目。结果是 3X3+3X3+3x3 + 3X3x3 = 54 行

    MATCH (l:Location)
    MATCH (d:Device)
    MATCH (u:User)
    WITH  collect(l) as locations, collect(d) as devices, collect(u) as users
    WITH apoc.coll.combinations(locations,1,1) as locations,  apoc.coll.combinations(devices,1,1) as devices, apoc.coll.combinations(users,1,1) as users 
    UNWIND locations as location
    UNWIND devices as device
    UNWIND users as user
    CALL {
           WITH location, device 
           RETURN collect(distinct  location+device) as cols 
           
           UNION ALL
    
           WITH location, user
           RETURN collect(distinct  location+user) as cols 
           
           UNION ALL
           
           WITH device, user
           RETURN collect(distinct  device+user) as cols
           
           UNION ALL
           
           WITH location, device, user
           RETURN collect(distinct  location+device+user) as cols
    }
    RETURN collect(distinct cols) as combColl
    

    当我展开最终集合时的结果:

    ╒══════════════════════════════╕
    │"combColl"                    │
    ╞══════════════════════════════╡
    │[[{"ID":1},{"ID":1}]]         │
    ├──────────────────────────────┤
    │[[{"ID":1},{"ID":2}]]         │
    ├──────────────────────────────┤
    │[[{"ID":1},{"ID":3}]]         │
    
    
    ....
    
    ├──────────────────────────────┤
    │[[{"ID":3},{"ID":2},{"ID":3}]]│
    ├──────────────────────────────┤
    │[[{"ID":3},{"ID":3},{"ID":1}]]│
    ├──────────────────────────────┤
    │[[{"ID":3},{"ID":3},{"ID":2}]]│
    ├──────────────────────────────┤
    │[[{"ID":3},{"ID":3},{"ID":3}]]│
    └──────────────────────────────┘
    

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多