Neo4j: запрос точного соответствия только указанному шаблону

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

В модели у меня есть несколько узлов product_pattern, действующих как центр или концентратор для нескольких узлов, представляющих различные продукты. Каждый узел продукта уникален и может быть связан с любым product_pattern. Серия узлов шаблона продукта может выглядеть так:

--pattern_1
--- Product A
--- Product B
--- Product C

--pattern_2
--- Product A
--- Product B
--- Product C
--- Product D

--pattern_3
--- Product B
--- Product C

Я хотел бы запросить график для product_patterns, которые используют продукты B и C и ТОЛЬКО B и C. Если бы я просто использовал:

Start b = node(16), c = node(37)
MATCH (b)<-[:PRODUCT_USED]-(n)-[:PRODUCT_USED]->(c)
RETURN n

Я бы вернул все product_patterns, потому что все они связаны с B и C. Чтобы удалить совпадения, которые имеют дополнительные отношения, из того, что я запрашиваю, я предвижу две стратегии.

  1. Создайте свойство в каждом узле шаблона product_pattern.num_products для использования с предложением WHERE после начального MATCH. В этом случае свойство num_products должно соответствовать «2» для узлов с отношениями ТОЛЬКО с B и C. Меня беспокоит то, что мне нужно копаться в каждом возвращаемом узле для свойств, и популярные продукты сделают список возврата намного больше.

  2. Создайте предложение WHERE NOT для каждого другого продукта в графе, который я не буду иметь отношения к ... не идеальному и, скорее всего, пересекающему весь граф.

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


person user1028468    schedule 31.10.2013    source источник


Ответы (1)


Вы можете попробовать это:

Start b = node(16), c = node(37)
MATCH (b)<-[:PRODUCT_USED]-(n)-[:PRODUCT_USED]->(c)
WHERE length((n)-[:PRODUCT_USED]->(c)) == 2
RETURN n
person Michael Hunger    schedule 03.11.2013