Сопоставьте идентификатор с его диапазоном дат и верните результат

#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"]