Коллекции, содержащие смешанные типы, не могут храниться в свойствах - PullRequest
0 голосов
/ 26 июня 2018

Я новичок в 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 ]

0 голосов
/ 26 июня 2018

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

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']
})

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

[UPDATE]

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

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

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

CREATE (table:Table $data)
0 голосов
/ 26 июня 2018

Я думаю, вам следует рассмотреть возможность использования метки узла :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)

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

Sample data

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

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