【发布时间】:2020-01-21 23:44:25
【问题描述】:
我有一张包含客户、交易和商家的图表,其连接如下所示:
(客户)->(交易)->(商家)。
我正在尝试有效地返回一个新图表,该图表通过共享不同客户(与两个商家进行过交易的客户)的数量连接各个商家,这可以解释为之间所有路径中不同客户节点的数量第一个商家节点到第二个商家节点。不幸的是,据我所知,在 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
我意识到这些查询非常讨厌,因为所有的笛卡尔乘积,以及当客户有大量交易时需要探索的大量路径。是否有任何技巧可以避免探索通过同一客户的路径?创建一个直接从客户到他们交易过的商家的图表是不是最好?
感谢任何建议。
【问题讨论】:
标签: neo4j cypher neo4j-apoc