首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Neo4j-DB中最常见的元组

在Neo4j-DB中最常见的元组
EN

Stack Overflow用户
提问于 2017-07-31 07:43:00
回答 1查看 693关注 0票数 1

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

代码语言:javascript
复制
(:order)-[:contains]->(:product)

我想知道是否有可能找到最常见的n元组的产品,以同样的顺序发生。

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

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

代码语言:javascript
复制
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,因为这些构成了所有订单的很大一部分,然后我匹配包含-在这些订单中的关系。我的计算机没有完成查询,考虑到创建了大型联接,这并不令人惊讶。

有没有一种方法可以找到不需要查询这么多可能性的元组,这样我的计算机就可以完成计算?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-01 11:51:50

正如您所指出的,产品组合的数量太高,所以最好从订单端开始生成元组,只生成现有的元组。

在筛选之前,您有一个不必要的MATCH,下面的内容应该足够过滤出以下命令:

代码语言:javascript
复制
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关系:

代码语言:javascript
复制
MATCH (o:order)
WITH o,size((o)-[:contains]->()) as NrProds
WHERE NrProds >= 3
WITH o
...

为了避免重复,通过按id、名称等对同一产品进行排序,筛选出相同产品的排列。(这个where子句只适用于唯一的名称/ids。如果你有副本,你需要<= )

代码语言:javascript
复制
...
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
...

然后返回每个元组,并列出订单数量:

代码语言:javascript
复制
RETURN p1,p2,p3,COUNT(o) as c

(如果单订单和产品之间存在多个contains关系,则应该使用COUNT(DISTINCT o))

最后,只返回N个元组:

代码语言:javascript
复制
ORDER BY c DESC LIMIT {n}

整个查询:

代码语言:javascript
复制
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}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45410050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档