Шифр Neo4J — слияние без учета регистра

#neo4j #cypher #case-insensitive

#neo4j #шифр #без учета регистра

Вопрос:

Есть ли способ выполнить СЛИЯНИЕ без учета регистра в Cypher (Neo4J)?

Я создаю график объектов, которые я смог извлечь из набора документов, и хочу объединить объекты, которые одинаковы в нескольких документах (принимая риск того, что одно и то же имя не означает, что это один и тот же объект!). Проблема в том, что регистр может различаться в разных документах.

На данный момент я использую синтаксис слияния для создания объединенных узлов, но он чувствителен к различиям в регистре. Как я могу выполнить слияние без учета регистра?

Комментарии:

1. привет, ты нашел решение? у вас была возможность опробовать предлагаемые ниже решения?

2. В итоге ни одно из предложенных решений не соответствовало нашим требованиям, поэтому мы изменили нашу схему, включив в нее помеченный узел, содержащий значение в верхнем регистре, которое мы можем объединить, сохраняя при этом информацию о регистре в исходном режиме. Например. (OriginalCase)-[верхний регистр]->(ORIGINALCASE)

3. вы можете опубликовать это как ответ и отметить, что ваш вопрос решен. Так что это будет полезно и кому-то еще..

Ответ №1:

Прямого способа нет, но вы можете попробовать что-то вроде приведенного ниже.СЛИЯНИЕ выполняется для сопоставления с шаблоном, и метки разных регистров образуют разные шаблоны

 MERGE (a:Crew123)
WITH a,labels(a) AS t
LIMIT 1
MATCH (n)
WHERE [l IN labels(n) 
  WHERE lower(l)=lower(t[0])] AND a <> n
WITH a,collect(n) AS s
FOREACH (x IN s | 
         DELETE a)
RETURN *
  

Приведенный выше запрос выдаст вам ERROR , но он удалит вновь созданный узел, если подобная метка существует. Вы можете добавить дополнительный шаблон в предложение MERGE . И в случае, если нет похожих меток, оно будет выполнено успешно.

Опять же, это просто обходной путь, чтобы не допускать новых похожих меток.

Ответ №2:

Если данные поступают, например, из CSV или аналогичного источника (параметр), вы можете использовать специальное, согласованное свойство case для слияния и установить исходное значение отдельно.

например

 CREATE CONSTRAINT ON (u:User) ASSERT u.iname IS UNIQUE;

LOAD CSV WITH HEADERS FROM "http://some/url" AS line
WITH line, lower(line.name) as iname
MERGE (u:User {iname:iname}) ON CREATE SET u.name = line.name;
  

Ответ №3:

Лучшим решением, которое мы нашли, было изменить нашу схему, включив в нее помеченный узел, содержащий значение в верхнем регистре, которое мы можем объединить, сохраняя при этом информацию о регистре в исходном режиме. Например. (OriginalCase)-[верхний регистр]->(ORIGINALCASE)