Попытка одного запроса Neo4j Cypher для моего графика

У меня есть «пользователи», которым принадлежат «предметы», пользователи также дружат друг с другом. Я пытаюсь создать шифрованный запрос, чтобы вернуть все предметы, которыми я владею, ПЛЮС те, которые принадлежат моим друзьям, в одном запросе. Я могу сделать их по отдельности, но не могу понять, как это сделать в одном запросе.

ОТНОШЕНИЯ:

(u:user)-[:OWNS]-(i:items)
(u:user)-[:FRIEND]-(f:user)

Допустим, у меня всего два пользователя в моей БД и 100 элементов. Из 100 первый человек владеет (1-5) 5 предметами, а второй человек владеет еще 5 предметами (6-10). Эти два пользователя также являются друзьями.

Я получаю 5 пунктов, если я делаю:

MATCH (uer1)-[:OWNS]->(i:items) return i

Я получаю еще 5 предметов, если я это делаю:

MATCH (uer1)-[:FRIEND]->(f)-[:OWNS]->(i:items) return i

Но мне нужно объединить их обоих для данного пользователя (user1), чтобы я мог вернуть все 10 элементов за один раз. Как это сделать?


person Raja Rao    schedule 31.03.2015    source источник


Ответы (1)


У вас есть два (или больше) варианта

Союз

MATCH (user:User {name:"Raja"})-[:OWNS]->(i:Item) return i
UNION
MATCH (user:User {name:"Raja"})-[:FRIEND]->(f)-[:OWNS]->(i:Item) return i

Пути переменной длины

MATCH (user:User {name:"Raja"})-[:FRIEND*0..1]->(f)-[:OWNS]->(i:Item) return i

в данном случае мы смотрим на друзей на расстоянии от 0 (сам пользователь) до единицы (друзья первой степени)

Первый вариант может быть быстрее, второй более универсален.

person Michael Hunger    schedule 31.03.2015
comment
Спасибо за быстрый ответ! Оба ответа хороши! Браузер 2.2 больше не показывает время, поэтому не уверен, какой из них быстрее. - person Raja Rao; 01.04.2015