我的数据库中的订单和产品节点通过包含关系连接:
spring.application.admin=false
我想知道是否有可能找到以相同顺序出现的最常见的n元组产品。
我担心这是不可能的,因为我有超过1500种产品,使得这些产品之间可能的组合数量非常高,即使是小n,例如。 1500 ^4≈5* 10 ^ 12。
我为n = 3编写了以下测试查询:
application.properties
首先,我确保不考虑任何产品数量少于3的订单,因为这些订单占所有订单的很大一部分,然后我匹配这些订单中的包含关系。 我的计算机没有完成查询,这在创建大型连接时并不奇怪。
有没有办法找到那些不涉及查询这么多可能性的元组,以便我的计算机可以完成计算?
答案 0 :(得分:0)
正如您所指出的,产品组合的数量太多,因此最好从订单一侧开始生成元组,以仅生成现有元组。
您的过滤器之前有一个不必要的MATCH
,以下内容足以过滤掉以下订单:
MATCH (o:order)-[r:contains]->(p:product)
WITH count(r) as NrProds, o
WHERE NrProds >= 3 // note >= sign for orders with 3 and more
WITH o
...
或order
仅针对产品使用contains
关系:
MATCH (o:order)
WITH o,size((o)-[:contains]->()) as NrProds
WHERE NrProds >= 3
WITH o
...
为了避免重复,通过按ID,名称等对它们进行排序来过滤掉相同产品的排列。(此where子句仅适用于唯一的名称/ ID。如果您有重复项,则需要< =在那里)
...
MATCH (o)-[r1:contains]->(p1:product),(o)-[r2:contains]->(p2:product),(o)-[r3:contains]->(p3:product)
WHERE p1.name < p2.name AND p2.name < p3.name
...
然后返回每个元组的订单数量:
RETURN p1,p2,p3,COUNT(o) as c
(如果您在单个订单和产品之间存在多个contains
关系,则应使用COUNT(DISTINCT o)
)
最后只返回N个元组:
ORDER BY c DESC LIMIT {n}
整个查询:
MATCH (o:order)
WITH o,size((o)-[:contains]->()) as NrProds
WHERE NrProds >= 3
WITH o
MATCH
(o)-[r1:contains]->(p1:product),
(o)-[r2:contains]->(p2:product),
(o)-[r3:contains]->(p3:product)
WHERE p1.name < p2.name AND p2.name < p3.name
RETURN p1,p2,p3,COUNT(o) as c
ORDER BY c DESC LIMIT {n}