我的数据库中有一个包含关系连接的订单和产品节点:
(:order)-[:contains]->(:product)我想知道是否有可能找到最常见的n元组的产品,以同样的顺序发生。
恐怕这是不可能的,因为我有超过1500个产品,使得这些可能组合的数量非常高,即使是小n,例如1500^4≈5*10^12。
我为n=3编写了以下测试查询:
MATCH (o:order)-[r:contains]->(p:product)
WITH count(r) as NrProds, o
MATCH (o)-[r:contains]->(p:product)
WHERE NrProds > 3
WITH o
MATCH (o)-[r1:contains]->(p1:product),(o)-[r2:contains]->(p2:product),(o)-[r3:contains]->(p3:product)
WITH o,p1,p2,p3,count(r1) as r1,count(r2) as r2,count(r3) as r3
WITH o,p1,p2,p3,
CASE WHEN r1<r2 AND r1<r3 THEN r1
WHEN r2<r1 AND r2<r3 THEN r2
WHEN r3<r1 AND r3<r2 THEN r3
END as result
WITH result,o,p1,p2,p3
RETURN count(result) as NrPurchs, o.Id,p1.name,p2.name,p3.name ORDER BY NrPurchs DESC首先,我确保不考虑任何订单的数量少于3,因为这些构成了所有订单的很大一部分,然后我匹配包含-在这些订单中的关系。我的计算机没有完成查询,考虑到创建了大型联接,这并不令人惊讶。
有没有一种方法可以找到不需要查询这么多可能性的元组,这样我的计算机就可以完成计算?
发布于 2017-08-01 11:51:50
正如您所指出的,产品组合的数量太高,所以最好从订单端开始生成元组,只生成现有的元组。
在筛选之前,您有一个不必要的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子句只适用于唯一的名称/ids。如果你有副本,你需要<= )
...
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}https://stackoverflow.com/questions/45410050
复制相似问题