Как структурировать базу данных графа для представления реляционной базы данных? - PullRequest
0 голосов
/ 04 февраля 2020

Я понимаю, что нет смысла пытаться встроить реляционную базу данных в графовую базу данных. Они оба по своей сути различны, и поэтому их данные должны быть организованы по-разному.

Однако я создаю приложение для документирования базы данных с использованием Neo4j. В этом приложении пользователь сможет загружать таблицы из базы данных SQL. Одна особенность заключается в том, что пользователь сможет просматривать первые 10 строк любой таблицы, которую он выберет.

Моя проблема заключается в следующем: я не знаю, как структурировать реляционную базу данных в моей базе данных Neo4j, так что я мог написать Cypher-запрос для распечатки таблицы в реляционном формате.

До сих пор я пытался:

(Database)-[HAS_TABLE]->(Ex_Table)
                                 `–[HAS_FIELD]->(id) ––––––[HAS_CELL]->(1)
                                 `–[HAS_FIELD]->(name)–––––[HAS_CELL]->(bob)
                                 `–[HAS_FIELD]->(password)–[HAS_CELL]->(pass)

и

(Database)-[HAS_TABLE]->(Ex_Table)
                                 `–[HAS_FIELD]->(id) –––––––\
                                 `–[HAS_FIELD]->(name)–––(HAS_ROW)->({id:1,name:bob,password: pass})
                                 `–[HAS_FIELD]->(password)––‘

Вопрос: Это правильно? Если так, как я могу запросить Ex_Table, используя Cypher для печати первых 10 строк? Если нет, то как мне структурировать и запрашивать, чтобы получить такой результат?

Примечание: я должен использовать базу данных графа.

1 Ответ

1 голос
/ 04 февраля 2020

Я думаю, что вам нужно больше метаданных вокруг графика, чтобы действительно сделать эту работу. Я бы применил такой подход для хранения ваших данных:

create pth= (d:Database {name: 'MyDB'})-[:HAS_TABLE]->(t:Table {name: 'Users'}),
(t)-[:HAS_COLUMN {order: 1}]->(c1:Column {name: 'Id'}),
(c1)-[:HAS_VALUE {row: 1}]->(v1:Value {value: '1'}),
(c1)-[:HAS_VALUE {row: 2}]->(v2:Value {value: '2'}),
(t)-[:HAS_COLUMN {order: 2}]->(c2:Column {name: 'Name'}),
(c2)-[:HAS_VALUE {row: 1}]->(v3:Value {value: 'Bob'}),
(c2)-[:HAS_VALUE {row: 2}]->(v4:Value {value: 'Jim'}),
(t)-[:HAS_COLUMN {order: 3}]->(c3:Column {name: 'Password'}),
(c3)-[:HAS_VALUE {row: 1}]->(v5:Value {value: 'password1'}),
(c3)-[:HAS_VALUE {row: 2}]->(v6:Value {value: 'SafePassword'})

Это даст вам график, который выглядит следующим образом: enter image description here

Теперь вы можете получить Структура таблицы с запросом, подобным следующему:

match (t:Table {name: 'Users'})-[r:HAS_COLUMN]->(c:Column)
return t.name, c.name
order by r.order

Чтобы извлечь строки выборки для таблицы, используйте запрос типа:

// Get the column names as a list
match (t:Table {name: 'Users'})-[r1:HAS_COLUMN]->(c:Column)
with 0 as rownum, r1.order as colnum, c.name as val order by colnum
with rownum, collect(val) as vals
return rownum, vals
union // will append the results of the 2nd match to the first
// Get the sample data values
match (t:Table {name: 'Users'})-[r1:HAS_COLUMN]->(c:Column)-[r2:HAS_VALUE]->(v:Value)
with r1.order as colnum, r2.row as rownum, v.value as val order by colnum
with rownum, collect(val) as vals order by rownum
return rownum, vals

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

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