Почему несколько узлов создаются в Neo4j по запросу CREATE или MERGE - PullRequest
0 голосов
/ 19 мая 2018

Я использую Cypher для создания некоторых данных в Neo4j.Это довольно простая модель продукта со следующими элементами:

  1. Продукт (например, мобильный)
  2. Особенности (например, быстрая зарядка)
  3. Сопутствующие товары (например, закаленное стекло)
  4. Торговые точки (например, местный магазин, сопутствующие товары продаются через торговые точки)

Я написал запрос для вставки данных. пытается

  • Создать продукт
  • Создать набор функций
  • Связать продукт с функцией [: HAS_FEATURES]
  • Создать торговые точки x3
  • Создать связанный продукт 1
  • Связать продукт со связанным продуктом [: HAS_RP] и связанный продукт со всеми розетками [: SOLD_THROUGH]
  • Создатьсвязанный продукт 2
  • Свяжите его с товаром и розетками, как указано выше

Ниже приведен актуальный запрос

//Product
CREATE (p:Product {name: 'Cool Mobile YX Plus',
  key: 'MOB0001',
  version: 'X.1'
}),

//Features
(f:Features {hasQuickCharge: true,
  isAvailable: true,
  hasVolte: false
})

MERGE (p) -[:HAS_FEATURES]-> (f)

//Outlets (:Product level lookup)
CREATE (o1:Outlet {productType: 'New', seller: 'National_Shops', prId: 'MOB0001'})
CREATE (o2:Outlet {productType: 'New', seller: 'Local_Shops', prId: 'MOB0001'})
CREATE (o3:Outlet {productType: 'New', seller: 'Online_Shops', prId: 'MOB0001'})

//Related products
CREATE (rps1:RPS {rpId: 'TGS1108',
  rpName: 'YX Plus Tampered Glass',
  price: 180.99
})
WITH rps1
MATCH (ol1:Outlet {productType: 'New', prId: 'MOB0001'})
MATCH (pr1:Product {key: 'MOB0001'})
MERGE (pr1) -[:HAS_RP {typeName: 'Child'}]-> (rps1)
MERGE (rps1) -[:SOLD_THROUGH]-> (ol1)

CREATE (rps2:RPS {rpId: 'CVR0204',
  rpName: 'YX Plus back cover',
  price: 299.00
})
WITH rps2
MATCH (ol2:Outlet {productType: 'New', prId: 'MOB0001'})
MATCH (pr2:Product {key: 'MOB0001'})
MERGE (pr2) -[:HAS_RP {typeName: 'ChargeFor'}]-> (rps2)
MERGE (rps2) -[:SOLD_THROUGH]-> (ol2)

Теперь проблема в том, что секундасвязанный продукт создается 3 раза , где он должен был быть создан только один раз, точно так же, как первый связанный продукт.

Может кто-нибудь помочь мне понять, что я делаю неправильно?Кроме того, любая помощь в написании запроса лучше.

enter image description here

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Просто пишу расширение к тому, что @Christophe и @InverseFalcon уже ответили / прокомментировали.Как объяснено в сбросе количества запросов , эта проблема была вызвана многократным выполнением CREATE.

Запросы выполняются для каждой строки.Таким образом, когда за MATCH следует CREATE, основываясь на результатах сопоставления, оператор CREATE может выполняться несколько раз и создавать несколько копий данных (если только нет ограничений уникального ключа / ключа узла), которые изначально предназначались дляможет быть создан только один раз.

MERGE может помочь с проблемами, поскольку он не будет создавать несколько копий, но MERGE по-прежнему выполняется несколько раз.

Это может быть обработано «сброс количества запросов» с использованием WITH DISTINCT.Ниже показан обновленный запрос, который решает проблему, а на рисунке показаны новые результаты.

//Related products
CREATE (rps1:RPS {rpId: 'TGS1108',
  rpName: 'YX Plus Tampered Glass',
  price: 180.99
})
WITH rps1
MATCH (ol1:Outlet {productType: 'New', prId: 'MOB0001'}) //3 match
MATCH (pr1:Product {key: 'MOB0001'})
MERGE (pr1) -[:HAS_RP {typeName: 'Child'}]-> (rps1)
MERGE (rps1) -[:SOLD_THROUGH]-> (ol1)

//next part of query will execute 3 times

//reset cardinality back to 1 with WITH DISTINCT
WITH DISTINCT 1 AS ResetCardinality
CREATE (rps2:RPS {rpId: 'CVR0204',
  rpName: 'YX Plus back cover',
  price: 299.00
}) //now CREATE & following executes only once
WITH rps2
MATCH (ol2:Outlet {productType: 'New', prId: 'MOB0001'})
MATCH (pr2:Product {key: 'MOB0001'})
MERGE (pr2) -[:HAS_RP {typeName: 'ChargeFor'}]-> (rps2)
MERGE (rps2) -[:SOLD_THROUGH]-> (ol2)

enter image description here

Поскольку я новичок в этом,если кто-то сможет показать, как лучше справиться со всей ситуацией с помощью более качественных письменных запросов, это поможет.

0 голосов
/ 19 мая 2018

Проблема находится здесь:

MATCH (ol1:Outlet {productType: 'New', prId: 'MOB0001'})

Вы создали до 3 узлов, соответствующих критериям MATCH:

CREATE (o1:Outlet {productType: 'New', seller: 'National_Shops', prId: 'MOB0001'}) CREATE (o2:Outlet {productType: 'New', seller: 'Local_Shops', prId: 'MOB0001'}) CREATE (o3:Outlet {productType: 'New', seller: 'Online_Shops', prId: 'MOB0001'})

Итак, MATCH (ol1:Outlet {productType: 'New', prId: 'MOB0001'}) вернет 3 строки и для каждой строки выполнит следующую часть запроса, 3 раза эту часть:

MATCH (pr2:Product {key: 'MOB0001'})
MERGE (pr2) -[:HAS_RP {typeName: 'ChargeFor'}]-> (rps2)
MERGE (rps2) -[:SOLD_THROUGH]-> (ol2)
...