#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)