Как вернуть 2 набора в одном шифрованном запросе с нулевым фильтром

Итак, я пытаюсь вернуть 2 набора из одного шифрованного запроса:

Если родительские узлы находятся в индексе, то

  1. потомки родительских узлов
  2. бездетные родительские узлы.

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

START Parents = node:app_fulltext('name:"City"'),
 MATCH Parents-[?:ChildOf]-Apps 
 RETURN collect(Apps.Title), collect(Parents.Name);

==> +--------------------------------------------------------------+
==> | collect(Apps.Title) | collect(Parents.Name)                  |
==> +--------------------------------------------------------------+
==> | ["Empty City 3D"]   | ["Empty City 3D","Empty City 3D Fake"] |
==> +--------------------------------------------------------------+

Это близко к тому, что я хочу. Однако я хочу отфильтровать из Parents.Name те элементы, у которых уже есть дочерние элементы в коллекции Apps.Title.

Это набор результатов, который я хотел бы получить. "Empty City 3D Fake" не имеет дочерних элементов, поэтому он возвращается в Parents.Name.

==> +--------------------------------------------------------------+
==> | collect(Apps.Title) | collect(Parents.Name)                  |
==> +--------------------------------------------------------------+
==> | ["Empty City 3D"]   | ["Empty City 3D Fake"]                 |

Когда я только что добавил предложение Where r is null, оно ничего не вернуло, поэтому для этого мне пришлось добавить два идентичных начальных родительских набора (Parents и Parents2). Тем не менее, это выглядит очень неуклюжим, поэтому я надеялся, что есть лучший способ.

START Parents = node:app_fulltext('name:"City"'), 
      Parents2 = node:app_fulltext('name:"City"')
      MATCH Parents-[r?:ChildOf]-Children, Parents2-[:ChildOf]-Apps 
      Where r is null 
      return collect(Apps.Title), collect(Parents.Name);


==> +--------------------------------------------------------------+
==> | collect(Apps.Title) | collect(Parents.Name)                  |
==> +--------------------------------------------------------------+
==> | ["Empty City 3D"]   | ["Empty City 3D Fake"]                 |
==> +--------------------------------------------------------------+

person MonkeyBonkey    schedule 28.03.2013    source источник


Ответы (1)


Можете ли вы попробовать это -

START Parents = node:app_fulltext('name:"City"'),
 MATCH Parents-[?:ChildOf]-Apps 
 WITH collect(Apps.Title) as myapps, collect(Parents.Name) as myparents
 RETURN myapps, filter(x in parents : not x in myapps) as myfilteredparents
person Gopi    schedule 28.03.2013
comment
Выглядит многообещающе, но с ним возникают проблемы в клиенте .net neo4j. Вы не могли бы показать мне, как я могу добавить его в предложение linq Return, не так ли? Придется еще немного протестировать, чтобы убедиться. - person MonkeyBonkey; 02.04.2013
comment
В java, используя репозитории Spring, мы сопоставляем возвращаемый тип с интерфейсом с аннотацией @MapResult. Не уверен, как вы это делаете в .net/linq. Чтобы получить представление, обратитесь к разделу 17.3 здесь static.springsource.org/spring-data/data-neo4j/docs/current/ - person Gopi; 02.04.2013