Вот супер простой способ сделать это
row2dict = lambda r: dict(r.items())
В этом случае будет проще работать со списками. Я заметил, что вы используете множественные имена переменных users
и viewerUsers
, но они не представляют списки, они представляют индивидуальное соответствие для каждой строки. Я нахожу, что это помогает, если вы сохраняете только множественные имена переменных для списков, что позволяет избежать некоторой путаницы.
Хотя мы могли бы использовать MATCH и collect (), чтобы получить список пользователей для исключения, мы примем ярлык и использование шаблона, чтобы получить список из совпадения в одной строке. И как только у нас есть список пользователей для исключения, мы можем использовать это в предложении WHERE для подключенных пользователей y
, чтобы мы отфильтровали все, что должно быть исключено (поскольку они подключены к x
).
WITH [(:User { id: x })-[:CONNECTED]-(user:User) | user] as excluded
MATCH (:User { id: y })-[:CONNECTED]-(user:User)
WHERE NOT user IN excluded
RETURN user
В качестве альтернативы вы можете взять оба списка и выполнить вычитание списков с помощью процедур APOC:
WITH [(:User { id: x })-[:CONNECTED]-(user:User) | user] as excluded,
[(:User { id: y })-[:CONNECTED]-(user:User) | user] as users
RETURN apoc.coll.subtract(users, excluded) as users
Обратите внимание, что этот будет возвращать только один список, поэтому, если вы хотите вернуться к нескольким записям с одним пользователем, каждый из которых вам понадобится пользователям UNWIND.