У меня есть график, на котором элементы могут быть разделены по-разному, т.е. кластеры элементов различаются между двумя разделами.Я хотел бы рассчитать Скорректированный индекс ранда между двумя разными разделами, чтобы оценить, насколько они различаются.
График
Это общая структура графика:
(:Store)-[:SELLS]->(:Product)-[:SIMILAR]-(:Product)<-[:SELLS]-(:Store)
--- red_beans ------ orange_beans ---
/ / \
supermart ------ yellow_beans --- --- ecomart
\ \ /
--- blue_beans ------ green_beans ---
--- blue_jello ---
/ \
supermart --- purple_jello --- --- ecomart
\ /
--- red_jello ---
В каждом магазине продаются товары разного цвета.
Каждый товар в магазине может быть похож на товар в другом магазине.
Кроме того, каждый магазин может объединять разные товары:
(:Product)-[:BUNDLED]-(:Product)
purple_jello --- red_beans --- blue_beans (supermart bundle)
red_jello --- orange_beans (ecomart bundle)
Вопрос
Независимо от цвета продукта (разные цвета продукта считаются одним и тем же продуктом), для продуктов, доступных в обоих магазинах(на самом деле аналогичные продукты - это один и тот же продукт, доступный в обоих магазинах), насколько различаются пакеты в разных магазинах?
Процесс
Первыйшаг будет уменьшать график, чтобы соответствовать вопросу.Он должен (виртуально) выглядеть следующим образом:
(:Store)-[:SELLS]->(:Product)-[:SIMILAR]-(:Product)<-[:SELLS]-(:Store)
supermart --- super_beans --- eco_beans --- ecomart
supermart --- super_jello --- eco_jello --- ecomart
Я хотел бы свести разные цвета продукта в один, посмотрев на их косвенное сходство.Товары из того же магазина, которые косвенно связаны сходством, будут считаться одинаковыми:
(a:Store)-[:SELLS]->(:Product)-[:SIMILAR*]-(:Product)<-[:SELLS]-(a:Store)
Связки также будут упрощены следующим образом:
(:Product)-[:BUNDLED]-(:Product)
super_jello --- super_beans (supermart bundle)
eco_jello --- eco_beans (ecomart bundle)
Это должно быть естественное расширениесокращения продуктов.Несколько ребер также будут сведены к одному.
Вторым шагом будет извлечение информации, необходимой для расчета ARI между различными разделами продуктов.ARI:
Для его вычисления необходимы три меры:
Количество пар товаров, найденных в обоих магазинахпачки.В основном, количество раз, когда этот шаблон присутствует на графике:
(a:Store)-[:SELLS]->(:Product)-[:SIMILAR]-(:Product)<-[:SELLS]-(b:Store)
| |
[:BUNDLED] [:BUNDLED]
| |
(a:Store)-[:SELLS]->(:Product)-[:SIMILAR]-(:Product)<-[:SELLS]-(b:Store)
Количество пар товаров, найденных в связках одного магазина,Как правило, количество раз, которое этот шаблон присутствует на графике для каждого магазина:
(a:Store)-[:SELLS]->(:Product)
|
[:BUNDLED]
|
(a:Store)-[:SELLS]->(:Product)
Количество возможных пар товаров в одном магазине.Поскольку мы рассматриваем только товары, доступные в обоих магазинах, в каждом магазине имеется одинаковое количество товаров, и это будет:
MATCH (a:Store)-[:SELLS]->(p:Product)
RETURN a, count(p)*(count(p)-1)/2
Реализация
Реализация этого в зашифрованных запросах не так естественна, как я ожидал.У меня проблемы с переводом моего процесса, особенно с первого шага, и я был бы признателен за любую помощь.
Редактировать: Это график, над которым я работаю:
with [
{
store: 'supermart',
products: ['red_beans','yellow_beans','blue_beans','purple_jello',
'orange_icecream','pink_icecream','blue_candy','brown_cake']
},
{
store: 'ecomart',
products: ['orange_beans','green_beans','blue_jello','red_jello',
'red_icecream','white_icecream','purple_candy','white_sugar']
}
] as sells
unwind sells as sell
merge (s:Store {name: sell.store})
with s, sell
unwind sell.products as product
merge (p:Product {name: product})
merge (s)-[:SELLS]->(p);
with [
['red_beans', 'purple_jello'],
['red_beans', 'blue_beans'],
['blue_beans', 'purple_jello'],
['yellow_beans', 'brown_cake'],
['orange_icecream', 'pink_icecream'],
['pink_icecream', 'blue_candy'],
['orange_beans', 'red_jello']
] as bundles
unwind bundles as bundle
match (p1:Product {name: bundle[0]})
match (p2:Product {name: bundle[1]})
merge (p1)-[:BUNDLED]-(p2);
with [
['red_beans', 'orange_beans'],
['yellow_beans', 'orange_beans'],
['yellow_beans', 'green_beans'],
['blue_beans', 'green_beans'],
['purple_jello', 'blue_jello'],
['purple_jello', 'red_jello'],
['orange_icecream', 'red_icecream'],
['pink_icecream', 'red_icecream'],
['pink_icecream', 'white_icecream'],
['blue_candy', 'purple_candy']
] as similarities
unwind similarities as similar
match (p1:Product {name: similar[0]})
match (p2:Product {name: similar[1]})
merge (p1)-[:SIMILAR]-(p2);
ARI для этого графика составляет 0,571428