计算路径中的不同节点



我有一个包含客户、交易和商家的图表,其连接如下所示:

(客户(->(交易(->(商家(。

我正在尝试有效地返回一个新图,该图通过共享的不同客户(与两个商家进行交易的客户(的数量连接各个商家,这可以解释为第一个商家节点到第二个商家节点之间的所有路径中不同客户节点的数量。不幸的是,据我所知,这在 Neo4j 中非常昂贵。为了让您了解我正在尝试做什么,以下是我尝试用于完成此操作的一些查询:

MATCH (m1:Merchant)<-[:TRANSACTION_WITH_MERCHANT]-()<-[:CUSTOMER_MADE_TRANSACTION]-(c)-[:CUSTOMER_MADE_TRANSACTION]->()-[:TRANSACTION_WITH_MERCHANT]->(m2:Merchant)
RETURN m1, m2, count(distinct c)
MATCH (m1:Merchant), (m2:Merchant)
WHERE id(m1)<id(m2)
MATCH p=(m1)<-[:TRANSACTION_WITH_MERCHANT]-()<-[:CUSTOMER_MADE_TRANSACTION]-(c)-[:CUSTOMER_MADE_TRANSACTION]->()-[:TRANSACTION_WITH_MERCHANT]->(m2)
RETURN m1, m2, count(distinct c) as n_connections

我意识到这些查询非常令人讨厌,因为所有的笛卡尔产品,以及当客户有大量交易时需要探索的大量路径。有什么技巧可以避免探索通过同一客户的路径吗?创建直接从客户到与他们交易的商家的图表是最好的吗?

我感谢任何建议。

很好地解决了我的问题以执行查询(尽管我确信有更好的解决方案。长话短说,我做了两件事:

使用指示客户
  1. 与该商家的交易数的属性直接在客户和商家之间创建了关系。

  2. 删除了交易数量较少的商家,以使跨产品更易于管理(没有看到解决此问题的方法(。

在客户和商家之间创造优势(已经只包括交易超过 40 笔的商家(。

match (m:Merchant)<-[t:TRANSACTION_WITH_MERCHANT]-()
with m, count(t) as nr_trans
where nr_trans > 40
match (c: Customer)-[:CUSTOMER_MADE_TRANSACTION]->(t:Transaction)-[:TRANSACTION_WITH_MERCHANT]->(m)
with c, m, count(t) as nr_transactions_with_merchant
merge (c)-[:CUSTOMER_TRANSACTED_WITH_MERCHANT {nr_transactions:nr_transactions_with_merchant}]->(m);

交易数量较少的下降边缘和商家:

match (m:Merchant)<-[:TRANSACTION_WITH_MERCHANT]-(t:Transaction)
with m, count(t) as nr_transactions_with_merchant
where nr_transactions_with_merchant <= 40
match (m)<-[e]-()
delete e
delete m;

运行的新查询!

MATCH (m1:Merchant), (m2:Merchant)
WHERE id(m1)<id(m2)
MATCH p=(m1)<-[:CUSTOMER_TRANSACTED_WITH_MERCHANT]-(c)-[:CUSTOMER_TRANSACTED_WITH_MERCHANT]->(m2)
RETURN m1, m2, count(c) as n_connections

最新更新