Как я могу гарантировать, что все узлы в базе данных графа, такой как AGE, уникальны?
Я использую AGE для создания графовой базы данных и хочу убедиться, что все узлы в моей базе данных уникальны. Я хочу, чтобы на моем графике не было нескольких узлов с одинаковыми свойствами и метками.
Например, если у меня есть узел с меткой Person и свойствами name и age, я хочу убедиться, что существует только один узел с меткой Person и такими же свойствами имени и возраста. Если создается второй узел с той же меткой и свойствами, я хочу предотвратить его добавление в базу данных или найти способ объединить два узла в один.
11 ответов
Вы можете написать ограничение для предотвращения дублирования в базе данных графа, например:
CREATE CONSTRAINT ON (p:Person)
ASSERT (p.name, p.age) IS NODE KEY
Кроме того, вы также можете использовать оператор MERGE, который создает новый узел, если он еще не существует, или обновляет свойства существующего узла.
Один из способов сделать это – определитьUNIQUE INDEX
по свойствам. Вы можете найти способ сделать это здесь . Но другой способ сделать это — использовать предложение MERGE следующим образом.
SELECT * FROM cypher('test', $$
MERGE (n: Label {name: 'xyz', age: 10})
RETURN n
$$) AS (result agtype);
Ссылка: Док
Вы можете добавить ограничение для проверки дублирования:
CREATE CONSTRAINT ON (p:Person)
ASSERT (p.name, p.age) IS NODE KEY
и вместо класса соответствия вы можете использовать класс слияния.
SELECT * FROM cypher('test', $$MERGE (n: Label {name: 'xyz', age: 10})RETURN n$$) AS (тип результата);
УНИКАЛЬНЫЙ УКАЗАТЕЛЬ по свойствам
Вы можете добиться этого с помощью предложения MERGE.
Использование:
SELECT * FROM cypher('graph_name', $$
MERGE (charlie:label {name: 'Charlie Sheen', age: 10})
RETURN charlie
$$) as (v agtype);
Здесь это сопоставляет узел или вершину с меткой и свойствами… возвращает его, если он уже существует, или создает его, если его нет…
ПРИМЕЧАНИЕ. Это будет работать только в том случае, если в вашей базе данных еще нет дубликатов, поскольку это не накладывает ограничений на реальный график. Предложение слияния реализует только функции поиска или создания.
Вы можете определить уникальный индекс для определенных свойств, например имени и возраста, чтобы предотвратить дублирование узлов. Это гарантирует, что добавление узла с такими же свойствами приведет к ошибке или его можно будет объединить с существующим узлом.
Чтобы гарантировать уникальность всех узлов в базе данных, вы можете использовать метод определения уникального идентификатора.
К каждому узлу можно добавить уникальный идентификатор. Это свойство может быть полезно для уникальной идентификации каждого узла. Это может быть комбинация свойств для формирования ключа или любого уникального идентификатора UID. Таким образом, перед добавлением узла вы можете проверить, существует или нет этот узел с таким же идентификатором, на основании чего вы можете обработать его соответствующим образом.
[apache-возраст] [PostgreSQL]
С помощью предложения CREATE CONSTRAINT вы можете создать ограничение на свойства узлов, чтобы гарантировать их уникальность.
CREATE CONSTRAINT ON (p:pin) ASSERT p.pin IS UNIQUE
Чтобы решить эту проблему, есть два решения, обсуждаемые ниже:
Вставляйте только уникальные узлы. Мы можем использовать оператор MERGE, чтобы гарантировать вставку только уникальных узлов. Например, вы хотите создать узел с именем Али и возрастом 25 лет . Использование может сделать это как:
Объединить существующие узлы. В этом решении мы используем несколько команд с оператором MERGE для обновления данных предыдущего узла данными нового узла, т. е. слияния двух повторяющихся узлов. Если появится какой-либо узел, аналогичный существующему, он сольется с ним.
MERGE (p:Person {name:'Ali', age: 25})
ON CREATE SET p.property = value
ON MATCH SET p.property = value
Я думаю, вам следует проверять каждый узел перед вставкой нового, например, создавать индекс на каждом узле. Это может снизить производительность, поэтому имейте в виду определенные параметры.
ИЛИ
Вы можете использовать предложение MERGE .
Чтобы решить эту проблему, сначала нужно создать ограничение, в этом вам придется
- создайте уникальное ограничение, чтобы предотвратить дублирование, и команда следующая:
CREATE CONSTRAINT unique_name on (n:Person) ASSERT (n.name) IS UNIQUE;
Это гарантирует, что никакие два узла с меткой Person не могут иметь одинаковое значение имени.
2.После создания уникального ограничения создайте свой узел с помощью следующей команды:
например:
SELECT * FROM cypher('People',$$ MERGE (n:Person {name: 'Michael Douglas',age:123}) RETURN n $$) AS (result agtype);