Подсчет отдельных узлов в пути - PullRequest
2 голосов
/ 22 января 2020

У меня есть график с клиентами, транзакциями и продавцами со связями, которые выглядят следующим образом:

(Клиент) -> (Транзакция) -> (Продавец).

Я пытаюсь эффективно вернуть новый график, который связывает различных продавцов по количеству общих отдельных клиентов (клиентов, которые заключили сделку с обоими продавцами), который можно интерпретировать как количество отдельных клиентских узлов в все пути между первым торговым узлом и вторым торговым узлом. К сожалению, из того, что я могу сказать, это слишком дорого делать в 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 голосов
/ 22 января 2020

Решил мою проблему достаточно хорошо, чтобы выполнить запрос (хотя я уверен, что есть лучшие решения. Короче говоря, я сделал две вещи:

  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...