У меня много связей и узлов, которые мне нужно добавить в базу данных Neo4j с помощью функции создания. Функция сначала создает множество узлов, анализируя параметры и в основном используя этот запрос:
UNWIND $props AS map
CREATE (n)
SET n = map
SET n:Label1:Label2
RETURN count(n) AS nodeCount
Затем я проверяю, что количество узлов, которые нужно добавить (т. Е. Количество элементов, проанализированных в функции), равно на количество узлов, которые подсчитываются после выполнения запроса. Это прекрасно работает в C# с использованием драйвера Neo4j, потому что я просто использую:
await _session.WriteTransactionAsync(async tx =>
{
var cursor = await tx.RunAsync(cypherQuery, parameters);
returnRecords = await cursor.ToListAsync();
});
Где параметры - это просто JSON файл с параметрами для различных узлов.
Тогда я Я хочу создать отношения, но у них много свойств, поэтому я хотел бы использовать функцию C#:
RunAsync(cypherQuery, parameterDictionary)
и просто создать словарь с формой:
{string keyForPropsForRel1, object mapOfPropertiesForRel1},
{string keyForPropsForRel2, object mapOfPropertiesForRel2},
{string keyForPropsForRel3, object mapOfPropertiesForRel3}, ...
Затем просто проанализируйте элементы в запросе шифрования, сначала сопоставив все соответствующие узлы, затем развернув все параметры в карты, затем запустив все функции создания, а затем установив данные. Итак, следующим образом:
MATCH(r1start{id:"guid1"})
MATCH(r1end{id:"guid2"})
MATCH(r2start{id:"guid3"})
MATCH(r2end{id:"guid4"})
...
UNWIND $keyForPropsForRel1 AS mapForRel1
UNWIND $keyForPropsForRel2 AS mapForRel2
...
CREATE (r1start)-[rel1:TypeLabel]->(r1end)
CREATE (r2start)-[rel2:TypeLabel]->(r2end)
...
SET rel1 = mapForRel1
SET rel2 = mapForRel2
...
Это работает, но кажется утомительным. Я также не думал, как проверить, успешно ли он работает. У кого-нибудь есть хороший способ сделать то, что я пытаюсь сделать? Я пытаюсь избежать нескольких вызовов базы данных.