计算路径中的不同节点
Counting distinct nodes in path
我有一个包含客户、交易和商家的图表,如下所示:
(客户)->(交易)->(商户)。
我正在尝试有效地 return 一个新图表,该图表通过共享的不同客户(与两个商家都进行过交易的客户)的数量连接各个商家,这可以解释为不同的数量第一个商家节点到第二个商家节点之间的所有路径中的客户节点。不幸的是,据我所知,在 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
我意识到这些查询非常讨厌,因为所有的笛卡尔积,以及当客户有大量交易时需要探索的大量路径。是否有任何技巧可以避免探索经过同一客户的路径?创建一个直接从客户到他们交易过的商家的图表是否最好?
我很感激任何建议。
很好地解决了我的问题以执行查询(尽管我确信有更好的解决方案。长话短说,我做了两件事:
直接在客户和商家之间建立关系,属性 表示客户与该商家的交易次数。
删除了交易量较低的商家,以使交叉产品更易于管理(没有解决此问题的方法)。
在客户和商家之间建立优势(已经只包括交易超过 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
我有一个包含客户、交易和商家的图表,如下所示:
(客户)->(交易)->(商户)。
我正在尝试有效地 return 一个新图表,该图表通过共享的不同客户(与两个商家都进行过交易的客户)的数量连接各个商家,这可以解释为不同的数量第一个商家节点到第二个商家节点之间的所有路径中的客户节点。不幸的是,据我所知,在 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
我意识到这些查询非常讨厌,因为所有的笛卡尔积,以及当客户有大量交易时需要探索的大量路径。是否有任何技巧可以避免探索经过同一客户的路径?创建一个直接从客户到他们交易过的商家的图表是否最好?
我很感激任何建议。
很好地解决了我的问题以执行查询(尽管我确信有更好的解决方案。长话短说,我做了两件事:
直接在客户和商家之间建立关系,属性 表示客户与该商家的交易次数。
删除了交易量较低的商家,以使交叉产品更易于管理(没有解决此问题的方法)。
在客户和商家之间建立优势(已经只包括交易超过 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