计算路径中的不同节点

时间:2020-01-21 23:44:25

标签: neo4j cypher neo4j-apoc

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

(客户)->(交易)->(商人)。

我正在尝试有效地返回一个新图,该图通过共享的不同客户(已与这两个商人进行交易的客户)的数量来连接各个商人,这可以解释为之间所有路径中不同客户节点的数量第一商人节点到第二商人节点。不幸的是,据我所知,在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 个答案:

答案 0 :(得分:0)

很好地解决了我的问题,可以执行查询(尽管我确定有更好的解决方案。总之,我做了两件事:

  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
相关问题