#java #neo4j #cypher
Вопрос:
List<String> id = new ArrayList<>();
String cypher = "unwind $dateRanges as dateRange match(f:File)-[c:CHANGED]-(fo:Folder) where c.changedDate < dateRange.endDate and c.changedDate > dateRange.startDate return dateRange.startDate, dateRange.endDate, f, fo, $id as id"
neo4J.getResults(
cypher,
Values.parameters(
"dateRanges", dateRangeMapList,
"id", id.remove(0)
),
results -> null
);
dateRangeMapList => [{startDate="2021-01-09", endDate="2021-01-15"},
{startDate="2021-01-15", endDate="2021-01-21"}]
id => ["123", "234"]
Мне нужно указать «123» для первого диапазона дат в списке dateRangeMapList и «234» для второго. id.remove(0) всегда устанавливает только первый идентификатор «123» для обоих диапазонов дат. Как к этому подойти ?
Ответ №1:
Я не эксперт по Java, но, насколько я понимаю, документы ArrayList.remove()
возвращают элемент, который был удален из списка. Итак, id.remove(0)
вернемся 123
. Я не понимаю, зачем ты звонишь id.remove(0)
.
У вас есть 2 варианта:
(1) Вставьте соответствующий идентификатор в dateRangeMapList
:
UNWIND $dateRanges AS dateRange
MATCH (f:File)-[c:CHANGED]-(fo:Folder)
WHERE c.changedDate < dateRange.endDate AND c.changedDate > dateRange.startDate
RETURN dateRange.startDate, dateRange.endDate, f, fo, dateRange.id AS id
dateRangeMapList => [
{ id="123", startDate="2021-01-09", endDate="2021-01-15" },
{ id="234", startDate="2021-01-15", endDate="2021-01-21" }
]
(2) Повторите оба массива, как цикл for (избегайте вызова id.remove(0)
):
UNWIND range(0, size($dateRanges)) AS index
MATCH (f:File)-[c:CHANGED]-(fo:Folder)
WHERE c.changedDate < $dateRanges[index].endDate AND c.changedDate > $dateRanges[index].startDate
RETURN $dateRanges[index].startDate, $dateRanges[index].endDate, f, fo, $id[index] AS id
dateRangeMapList => [
{ startDate="2021-01-09", endDate="2021-01-15" },
{ startDate="2021-01-15", endDate="2021-01-21" }
]
id => ["123", "234"]