2016-12-29 2 views
1

Я новичок в CQL, кто-нибудь поможет мне решить запрос, чтобы найти список подписчиков с флагом, если я также последую за ним. я пытаюсь как этот способcypher match query merge result set

MATCH (n:users_master)-[r:FOLLOW]->(m:users_master) 
OPTIONAL MATCH (n:users_master)<-[r2:FOLLOW]-(m:users_master) 
CASE when EXISTS(r2) THEN n.flag= 1 ELSE n.flag=0 END 
where id(m)=35 
RETURN n 

уведомления здесь я хотел бы также добавить флаг виртуальной собственности в наборе результатов LIKE {"updated_at":"12/26/2016, 3:45:38 PM", "created_on":"12/26/2016, 3:45:38 PM", "last_name":"john", "first_name":"john", "email":"[email protected]", "facebook_id":"12341", "status":"Active", "id":35 "flag":1 }

+1

Отношения в вашем ФАКУЛЬТАТИВНОМ MATCH имеет стрелки на обоих концах, вы можете исправить это до. Кроме того, вместо 1 и 0, будет ли логическое возвращение работать для вас? Это можно сделать очень легко. – InverseFalcon

+0

извините стрелку, это ошибочно, я удалил это – shivshankar

ответ

2

EXISTS() функция может быть использована для проверки существования шаблон, и в вашем случае вы можете заменить свой ДОПОЛНИТЕЛЬНЫЙ МАТЧ.

Кроме того, переменные в ваших шаблонах не нужны, если вы не собираетесь их использовать, поэтому вам вообще не нужны эти отношения в ваших отношениях.

MATCH (n:users_master)-[:FOLLOW]->(m:users_master) 
WHERE id(m)=35 
RETURN n, EXISTS((n)<-[:FOLLOW]-(m)) as flag 

«флаг» будет отдельный столбец с булевым на том или нет последующего взаимно.

Что касается добавления «виртуального объекта», то в Neo4j 3.1+ вы можете использовать Map Projection, чтобы добавить пользовательские значения к проекции карт возвращенных узлов.

Вы можете использовать этот запрос с картографической проекции, чтобы включить флаг в возвращении свойств узла:

MATCH (n:users_master)-[:FOLLOW]->(m:users_master) 
WHERE id(m)=35 
RETURN n {.*, flag: EXISTS((n)<-[:FOLLOW]-(m)) } 

EDIT

картографической проекции, используемый в запросе выше, был введен и работает только в Neo4j 3.1.x и выше.

Для версий 3.0.x я не верю, что существует множество вариантов для извлечения всех свойств узла на карте и добавления нового значения к этой карте перед возвратом (предложение SET зарезервировано для узлов, а не для карт).

Возможно, вам понадобится установить APOC procedures для обходного пути, так как он предоставляет несколько вспомогательных процедур и функций, включая map operations.

Это должно работать после того, как соответствующая версия АПБО добавляется к экземпляру Neo4j:

MATCH (n:users_master)-[:FOLLOW]->(m:users_master) 
WHERE id(m)=35 
RETURN apoc.map.setKey(properties(n), 'flag', EXISTS((n)<-[:FOLLOW]-(m))) as n 
+0

Также просто хочу отметить, что использование поиска с помощью идентификатора узла neo4j не рекомендуется, так как идентификаторы возвращаются и повторно используются при удалении узлов. Это означает, что если узлы или отношения удалены в neo4j, а идентификатор используется повторно для другого узла, тогда системы вне neo4j, в которых вы храните этот идентификатор, могут не синхронизироваться с тем, где этот идентификатор указывает сейчас. Рекомендуется использовать ваши собственные уникальные идентификаторы на ваших узлах, если это необходимо, например UUID. – InverseFalcon

+0

спасибо Falcon, но это не работает в neo4j> 3. есть ли у вас альтернатива? – shivshankar

+0

Это будет работать в Neo4j 3.1.x и выше. Версии 3.0.x не имеют функции проекции карты. Вероятно, вам придется использовать процедуры APOC в качестве обходного пути. Я обновил свой ответ с помощью этого альтернативного решения. – InverseFalcon

 Смежные вопросы

  • Нет связанных вопросов^_^