Коллекции, содержащие смешанные типы, не могут храниться в свойствах

Я новичок в Neo4j, я пытаюсь создать узел следующим образом:

neo4_session.run("MERGE (t:Table {name: $name, columns: $columns}) ",
     name=table['table_name'], columns=[{'colname':'a'},{'colname':'b'},{'colname':'c'}])

Neo4j говорит мне это:

neo4j.exceptions.CypherTypeError: Коллекции, содержащие смешанные типы, не могут быть сохранены в свойствах.

Это означает, что это позволяет мне иметь список:

neo4_session.run("MERGE (t:Table {name: $name, columns: $columns}) ",
     name=table['table_name'], columns=['a','b','c'])

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

Любой совет?

2 ответа

Решение

Я думаю, вы должны рассмотреть возможность использования :Column метка узла вместо списка столбцов в :Table узел.

Таким образом, вы можете смоделировать свой график следующим образом:

CREATE (table:Table {name : 'Table 1'})
CREATE (columnA:Column {colname : 'a'})
CREATE (columnB:Column {colname : 'b', otherProp: 'Other value'})
CREATE (columnC:Column {colname : 'c'})
CREATE (table)-[:CONTAINS]->(columnA)
CREATE (table)-[:CONTAINS]->(columnB)
CREATE (table)-[:CONTAINS]->(columnC)

В результате:

Пример данных

Кроме того, это более "графический" способ моделирования ваших данных.

Самый простой подход - просто сохранить каждый столбец как свойство:

CREATE (table:Table {name: 'Table 1', colName1: 'a', colName2: 'b', colName3: 'c'})

И если по какой-то причине вам нужен доступ к столбцам в порядке столбцов, вы можете иметь массив, скажем, colNames, в котором хранятся упорядоченные имена столбцов:

CREATE (table:Table {
  name : 'Table 1',
  colName1: 'a', colName2: 'b', colName3: 'c',
  colNames: ['colName1', 'colName2', 'colName3']
})

Также см. Этот связанный вопрос и третий подход, который я предложил в своем ответе.

[ОБНОВИТЬ]

Как указано @Tezra, выше CREATE предложения могут быть уточнены, чтобы просто принять параметр, значение которого является картой, динамически генерируемой вашим кодом. Например, если это было передано как $data параметр:

{
  name : 'Table 1',
  colName1: 'a', colName2: 'b', colName3: 'c',
  colNames: ['colName1', 'colName2', 'colName3']
}

тогда это CREATE предложение получит те же результаты, что и мое предыдущее предложение:

CREATE (table:Table $data)
Другие вопросы по тегам