2017-07-31 57 views
1

我有一个载有以下关系连接的订单和产品在我的数据库的节点:最常见的元组

(: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个的占全部订单的很大一部分,然后我匹配这些订单中的包含关系。 鉴于正在创建的大型联接,我的计算机没有完成查询,这并不奇怪。

有没有办法找到不涉及查询这么多可能性的元组,这样我的电脑就可以完成计算了?

回答

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} 
+0

此查询绝对比我的整洁。如果我等待足够长时间,我的电脑甚至会结束。所以谢谢你。 您是否添加了 “WHERE p1.name

+0

是的,'WHERE'条件是为了避免重复 - 我想你认为p1,p2,p3和p3,p2,p1,...是一样的。尝试使用一个订单和产品a,b,c,看看第二个'MATCH'返回的内容(之后没有进行聚合),仅使用一半条件时返回的内容等。了解密码如何绑定变量很重要。 –