Коллекции, содержащие смешанные типы, не могут храниться в свойствах
Я новичок в 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)