Вычисление ARI путем поиска шаблонов в уменьшенном графике - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть график, на котором элементы могут быть разделены по-разному, т.е. кластеры элементов различаются между двумя разделами.Я хотел бы рассчитать Скорректированный индекс ранда между двумя разными разделами, чтобы оценить, насколько они различаются.

График

Это общая структура графика:

(: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

...