Как можно написать шифрованный запрос для создания гиперребер?

У меня есть график с предложениями и клиентами. Клиент может поделиться предложением с другим клиентом, поэтому, когда это происходит, я создаю гиперребро.

(КлиентA)-[:SHARED_OFFER]->(новый узел)

(новый узел)-[:FOR_OFFER]->(предложение)

(newNode)-[:SHARED_WITH]->(клиенты) (это может быть много клиентов)

Теперь, если другой клиент B делится одним и тем же предложением с другими, я бы хотел, чтобы новый узел был создан для представления этой связи. Есть ли способ выполнить все это в одном запросе Cypher?

Я использую:

start c=node:node_auto_index(name="C1"), o=node:node_auto_index(name="Offer"), sharedCustomer=node:node_auto_index(name="C2")
create unique c-[:SHARED_OFFER]->(sharedOffer)-[:FOR_OFFER]->(o), (sharedOffer)-[:SHARED_WITH]->(sharedCustomer)

который работает в первый раз. См. консоль по адресу: http://console.neo4j.org/r/76no2g Этот запрос корректен создал отношения, когда C1 поделился предложением с C2.

Выполнение запроса для случая, когда C2 теперь разделяет предложение с C3, приводит к повторному использованию одного и того же узла — это не то, что мне нужно. Должен быть новый узел, созданный из C2 с отношением SHARED_OFFER. Вот запрос:

start c=node:node_auto_index(name="C2"), o=node:node_auto_index(name="Offer"), sharedCustomer=node:node_auto_index(name="C3")
create unique c-[:SHARED_OFFER]->(sharedOffer)-[:FOR_OFFER]->(o), (sharedOffer)-[:SHARED_WITH]->(sharedCustomer)

Любая помощь приветствуется. Примечание. Я использую 1.8.1 REST, поэтому пытаюсь выполнить все за один раз, а не по частям.


person Luanne    schedule 13.02.2013    source источник


Ответы (1)


просто не используйте create unique, а просто create. но не забудьте сначала указать все узлы, которые вы получили в пути, в предложении start и оставить параметр sharedOffer всегда неуказанным, чтобы команда create создавала только неуказанные элементы.

update используйте create вместо create unique и фильтруйте существующие отношения (или используйте 2 запроса — один, чтобы проверить, существует ли уже sharedOffer с C1, и второй, чтобы обновить sharedOffer с C3):

START c=node:node_auto_index(name="C1"), o=node:node_auto_index(name="Offer"), sharedCustomer=node:node_auto_index(name="C2")
WHERE not(c-[:SHARED_OFFER]->(sharedOffer)-[:FOR_OFFER]->(o))
CREATE c-[:SHARED_OFFER]->(sharedOffer)-[:FOR_OFFER]->(o), (sharedOffer)-[:SHARED_WITH]->(sharedCustomer)
person ulkas    schedule 14.02.2013
comment
Если я использую только создание, то совместное использование C2 с C3 работает должным образом. Но выполните то же самое создание с теперь C1 и C3 --- и будет создан новый общий узел предложения вместо повторного использования узла из первого общего ресурса C1->C2. Вот почему я остановился на уникальном :-) Кроме того, не могли бы вы пояснить, что вы имели в виду, оставив sharedOffer неуказанным? - person Luanne; 14.02.2013
comment
Фильтр не пробовал - идея интересная. Приведенный выше запрос удовлетворяет некоторым случаям, но, к сожалению, не всем. Например, если C1 уже поделился O1 с C2, тогда C1, совместно использующий O1 с C3, должен повторно использовать существующее общее предложение и просто создать общее предложение для узла C3. Попытка удовлетворить все это в одном запросе была сложной, поэтому разместила ее здесь. Попробую с некоторыми фильтрами, иначе он будет разбит на два запроса. Спасибо. - person Luanne; 14.02.2013