Как мне использовать Structr для перебора элементов в коллекции cypher?

#cypher #structr

#cypher #structr

Вопрос:

Я пробую Structr, который кажется отличным, но я сталкиваюсь с проблемой, когда я хочу перебирать возвращенную коллекцию и выводить html-элемент для каждого элемента в ней. Это немного усложняется тем фактом, что мне также нужно использовать merge_unique для коллекции, прежде чем я это сделаю, потому что старая версия neo4j Structr использует ограничения на комбинацию необязательных совпадений и сбора (отличное n).

Вот запрос, который я делаю в панели запросов cypher в Structr:

 MATCH (c:Country) WHERE c.code = 'US'
Optional match (c)<-[:THING_IN]-(t:Thing)-[:THING_BELONGS_TO]-(p:Project)
optional match (p)<-[:SPONSORS]-(sp)
where p.status = "ACTIVE"
with c, collect(distinct p) as projects, collect(sp.name) as sponsors
RETURN {
    name:c.name, 
    code:c.code, 
    open_projects:size(filter(x IN projects WHERE x.status = "ACTIVE")),
    closed_projects:size(filter(x IN projects WHERE x.status <> "ACTIVE")),
    all_projects:size(projects),
    sponsors:sponsors
}
  

Итак, «спонсоры» возвращаются как неотличимая коллекция всех имен спонсоров проектов. Он работает, чтобы затем перебирать спонсоров, если они возвращаются как объекты, и отображать $ {sponsor.name } (после создания привязки данных с помощью sponsor = merge_unique(data.sponsors) , но я не могу просто отобразить каждого спонсора из набора строковых переменных.

Я не уверен, что я хорошо это объясняю, но если вы использовали Structr, я ожидаю, что это проблема, с которой вы столкнулись. Если вы можете указать мне правильное направление, заранее спасибо.

Комментарии:

1. Вы пробовали последний снимок? Работает с Neo4j 3.0. Я также скоро опубликую ответ ниже.

Ответ №1:

Воспроизводя ваш запрос со следующими тестовыми данными, я получаю тот же результат (неразличимый список имен спонсоров).

Данные

Если я добавлю a distinct в оператор Cypher, он вернет отдельную коллекцию спонсоров:

 [...]
with c, collect(distinct p) as projects, collect(distinct(sp.name)) as sponsors
[...]
  

Обратите внимание, что коллекция в sponsors уже является строковым массивом, поэтому вы не можете легко использовать Structr repeater (есть способ, но он более сложный).

Чтобы напрямую использовать привязку данных Structr, измените запрос, чтобы возвращать объекты ( sp.name => sp ) и создайте вложенный повторитель с запросом функции (в моем примере привязанный к элементу <b>:

 [...]
with c, collect(distinct p) as projects, collect(distinct(sp)) as sponsors
[...]
  

введите описание изображения здесь

Комментарии:

1. Спасибо. Это то, что я сделал. Мне действительно нравится Structr. Есть мысли о том, когда выйдет следующий релиз?

2. Вероятно, вокруг GraphConnect.