Аннотация: В моделях графов, таких как Semantic Web, в соответствии с предположением об открытом мире факты, не включенные в данные, считаются неизвестными, а не ложными.
Эта статья опубликована в сообществе HUAWEI CLOUD.«Поддержка графической базы данных для значений атрибутов NULL», Автор оригинала: Привет _TT.
NULL (нулевое значение) — это идентификация неизвестных или отсутствующих атрибутов данных в базе данных, используемая для указания значений данных, которых нет в базе данных. Когда значение атрибута узла или ребра данных графа в базе данных графа отсутствует или не определено, значением атрибута является NULL.
Так почему же графовые базы данных должны поддерживать значения NULL?
В графовых моделях, таких как Semantic Web, в соответствии с предположением об открытом мире факты, не включенные в данные, считаются скорее неизвестными, чем ложными. Например, для графовой базы данных, содержащей несколько студентов, есть следующие два запроса:
Запрос 1: Узнайте, какой университет находится в Университете Цинхуа.
Запрос 2: Узнайте, кто не является университетом в Университете Цинхуа.
Если одноклассник Сяомина в базе данных графа не заполняет школу, то принадлежит ли Сяомин к набору результатов запроса 1 или набору результатов запроса 2. Гипотеза открытого мира считает, что данные, которые не включены, неизвестны и не являются ложными.При поддержке этой логики Сяо Мин не является ни ответом на первый вопрос, ни ответом на второй вопрос.
Базы данных Graph реализуют эту логику через значения NULL.
Давайте посмотрим на поддержку значений атрибута NULL в каждой базе данных графа.
GDB
Для типа данных string поддерживается пустая строка нулевой длины, которая представляется как: "", а пустое поле без двойных кавычек указывает на то, что оно не существует, и это nullptr.
NebulaGraph
По умолчанию при вставке точки или ребра значение атрибута может быть NULL, также пользователь может установить значение атрибута не NULL (НЕ NULL), то есть значение этого атрибута должно быть установлено при вставке точки или край, если он не был установлен при создании атрибута Defaults.
HugeGraph
Вы можете указать некоторые строки для представления нулевых значений, например "NULL". Если атрибут вершины/ребра, соответствующий этому столбцу, также является атрибутом, допускающим значение null, значение этого атрибута не будет установлено при построении вершины/ребра.
Amazon Neptune
Допускаются пустые поля, пустое поле считается значением NULL.
Neo4j
В Cypher NULL используется для представления отсутствующих или неопределенных значений. Концептуально NULL означает отсутствующее неизвестное значение, которое обрабатывается несколько иначе, чем другие значения.
Gremlin
TinkerGraph можно настроить для поддержки NULL в качестве значения свойства, но не все продукты баз данных графов поддерживают это. Поэтому обязательно проверьте функциональность supportsNullPropertyValues() или ознакомьтесь с документацией перед ее использованием.
TigerGraph
Атрибуты NULL и NOT NULL не поддерживаются. Значение NULL не поддерживается в базах данных графов. Если свойству не присваивается значение при создании экземпляра вершины или ребра, свойству присваивается значение по умолчанию для этого типа данных, который в последней версии объявлен устаревшим.
Сервис Huawei Cloud Graph Engine GES
Поддерживаются значения свойства NULL. При вводе пустого поля значение атрибута считается NULL.
Следующий пример иллюстрирует, предполагая, что схема импортированных данных:
<label name="movie">
<properties>
<property name="ChineseName" cardinality="single" dataType="string"/>
<property name="Year" cardinality="single" dataType="int"/>
</properties>
</label>
<label name="user">
<properties>
<property name="Gender" cardinality="single" dataType="enum" typeNameCount="2" typeName1="F" typeName2="M"/>
<property name="School" cardinality="single" dataType="string"/>
<property name="Age" cardinality="single" dataType="int"/>
</properties>
</label>
<label name="rate">
<properties>
<property name="Datetime" cardinality="single" dataType="date"/>
<property name="Score" cardinality="single" dataType="double" />
</properties>
</label>
Импортированные данные точки:
张三,user,M,清华大学
李四,user,,北京大学,20
小明,user,,,21
Titanic,movie,泰塔尼克号,1997
Импортированные данные края:
张三,Titanic,rate,,4
Вызов собственного интерфейса API GES для пограничного запроса:
GET http://{SERVER_URL}/ges/v1.0/{project_id}/graphs/{graph_name}/edges/detail? source=张三&target=Titanic
получил ответ:
"edges": [
{
"index": "0",
"source": "张三",
"label": "rate",
"properties": {
"Score": [
4.0
],
"Datetime": [
null
]
},
"target": "Titanic"
}
]
Можно видеть, что значение атрибута Datetime запрошенного ребра равно null , потому что поле атрибута является пустым полем при вводе.
Кроме того, GES поддерживает два основных языка запросов к графам, Gremlin и Cypher.Затем мы используем Cypher для проверки вопросов, поднятых в начале статьи.
Сделайте следующие три запроса соответственно:
match (n:user) where n.School='清华大学' return n
match (n:user) where n.School<>'清华大学' return n
match (n:user) where n.School is null return n
Полученные результаты запроса:
"row": [
{
"School": "清华大学",
"Gender": "M",
"Age": null
}
],
"meta": [
{
"id": "张三",
"type": "node",
"labels": [
"user"
]
}
]
"row": [
{
"School": "北京大学",
"Gender": null,
"Age": 20
}
],
"meta": [
{
"id": "李四",
"type": "node",
"labels": [
"user"
]
}
]
"row": [
{
"School": null,
"Gender": null,
"Age": 21
}
],
"meta": [
{
"id": "小明",
"type": "node",
"labels": [
"user"
]
}
]
Когда n.School имеет значение null, возвращаемые значения n.School'Университет Цинхуа' и n.School='Университет Цинхуа' неверны, поэтому Сяомин отсутствует в наборе результатов первых двух запросов. . За этим стоит троичная операционная логика, поддерживаемая GES Cypher, которая поддерживает запрос, описанный в начале статьи, а также следует предположению об открытом мире таких моделей, как Semantic Web.
Нажмите «Подписаться», чтобы впервые узнать о новых технологиях HUAWEI CLOUD~