Как написать запрос на шифрование, чтобы найти узлы, помеченные определенными тегами? - PullRequest
0 голосов
/ 15 февраля 2019

Структура базы данных:

(:Event)-[:IS_TAGGED_BY]->(:EventTag {value})

Комментарии к структуре:

  • Есть узлы событий
  • Есть узлы EventTag
  • Tagузлы имеют строковое свойство, называемое «значение»
  • События могут быть помечены тегами через исходящую версию IS_TAGGED_BY rel

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

Возможны два варианта такого запроса, которые возвращают:

  1. События, помеченные хотя бы одним из указанных тегов (назовем его findTaggedByAny).
  2. События, помеченные всеми указанными тегами (назовем это findTaggedByAll).

Я могу написать запрос findTaggedByAny:

MATCH (et:EventTag)--(e:Event) WHERE et.value in {0} RETURN e

здесь{0} - это где параметр запроса, содержащий набор значений тегов, будет заменен.

Итак, после замены запрос будет выглядеть так:

MATCH (et:EventTag)--(e:Event) WHERE et.value in ["tag1", "tag2"] RETURN e

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

1 Ответ

0 голосов
/ 15 февраля 2019

[ОБНОВЛЕНО]

  1. Если вы хотите получать события, которые связаны со всеми тегами в БД, вы можете выполнить эффективную проверку «степени», как это (при условиичто событие связано не более одного раза с определенным тегом, а отношение IS_TAGGED_BY используется только для подключения событий к тегам):

    MATCH (t:EventTag)
    WITH COUNT(t) AS numTags
    MATCH (e:Event)
    WHERE SIZE((e)-[:IS_TAGGED_BY]->()) = numTags
    RETURN e;
    
  2. Если вместо этого выхотите получить события, помеченные тегом any в параметре tagList:

    MATCH (e:Event)-[:IS_TAGGED_BY]->(t:EventTag)
    WHERE t.value IN $tagList
    RETURN e;
    
  3. Если вместо этого вы хотите получить события, помеченныена все теги в параметре tagList:

    MATCH (e:Event)-[:IS_TAGGED_BY]->(t:EventTag)
    WITH e, COLLECT(t.value) AS tagValues
    WHERE ALL(v IN tagValues WHERE v IN $tagList)
    RETURN e;
    

    Кроме того, если событие имеет относительно небольшое количество тегов, этот более длинный запрос может быть на самом деле быстрее (навыполнение проверки степени перед тем, как на самом деле смотреть на теги):

    MATCH (e:Event)
    WHERE SIZE((e)-[:IS_TAGGED_BY]->()) >= SIZE($tagList)
    MATCH (e)-[:IS_TAGGED_BY]->(t:EventTag)
    WITH e, COLLECT(t.value) AS tagValues
    WHERE ALL(v IN tagValues WHERE v IN $tagList)
    RETURN e;
    
...