Neo4j-DB中最常见的元组

时间:2017-07-31 07:43:01

标签: neo4j cypher combinatorics

我的数据库中的订单和产品节点通过包含关系连接:

spring.application.admin=false

我想知道是否有可能找到以相同顺序出现的最常见的n元组产品。

我担心这是不可能的,因为我有超过1500种产品,使得这些产品之间可能的组合数量非常高,即使是小n,例如。 1500 ^4≈5* 10 ^ 12。

我为n = 3编写了以下测试查询:

application.properties

首先,我确保不考虑任何产品数量少于3的订单,因为这些订单占所有订单的很大一部分,然后我匹配这些订单中的包含关系。 我的计算机没有完成查询,这在创建大型连接时并不奇怪。

有没有办法找到那些不涉及查询这么多可能性的元组,以便我的计算机可以完成计算?

1 个答案:

答案 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}