Объединить несколько типов отношений и вернуть данные из обоих отношений - PullRequest
0 голосов
/ 15 октября 2019

Итак, в настоящее время я пишу запрос Cypher, в котором я хочу получить все записи в базе данных и их отношения, чтобы импортировать их в Cytoscape для дальнейшего анализа.

Я хочу объединить два типа отношений в одинпеременной, используйте операцию WHERE для них и верните результаты. Допустим, я хочу получить список интересных фильмов, основываясь на том, сколько человек потратил (например, на коллекционное издание) или действительно ли ему удалось посмотреть фильм.

Прямо сейчас мой запрос выглядит следующим образом: на основе этого примера :

MATCH (p:Person)-[rel:`watched`|`bought`]->(c:Movie)
WHERE
(rel.watch_min >= 50) or (rel.bought_price > 10)
RETURN p, rel, c

Теперь в браузере Neo4j это работает. Но вывод rel имеет только свойства отношения из отношения watched, а не объединенного.

Как должен выглядеть запрос, чтобы rel содержал оба свойства, начиная с watched а bought?

В основном я хочу написать следующее:

MATCH (p:Person)-[r1:`watched`|r2:`bought`]->(c:Movie)
WHERE
(rl.watch_min >= 50) or (r2.bought_price > 10)
RETURN p, r1, r2, c

Но, к сожалению, это неверный синтаксис.

1 Ответ

1 голос
/ 15 октября 2019

Если я создаю несколько примеров данных:

CREATE
  (p:Person{id: 123})-[:watched{watch_min: 60}]->(m:Movie{name:'Foo'}),
  (p)-[:bought{bought_price:99}]->(m);

и выполняю ваш первый запрос, я получаю следующий результат:

╒══════════╤═══════════════════╤══════════════╕
│"p"       │"rel"              │"c"           │
╞══════════╪═══════════════════╪══════════════╡
│{"id":123}│{"bought_price":99}│{"name":"Foo"}│
├──────────┼───────────────────┼──────────────┤
│{"id":123}│{"watch_min":60}   │{"name":"Foo"}│
└──────────┴───────────────────┴──────────────┘

Итак, ваш запрос работает нормально и возвращаетоба типа отношений.

Если вы действительно хотите объединить свойства всех отношений между парой узлов, вы можете использовать функцию APOC apoc.map.mergeList для объединения:

MATCH (p:Person)-[rel:watched|bought]->(c:Movie)
WHERE (rel.watch_min >= 50) OR (rel.bought_price > 10)
RETURN p, c, apoc.map.mergeList(COLLECT(rel)) AS props;

, который возвращает этот результат:

╒══════════╤══════════════╤══════════════════════════════════╕
│"p"       │"c"           │"props"                           │
╞══════════╪══════════════╪══════════════════════════════════╡
│{"id":123}│{"name":"Foo"}│{"bought_price":99,"watch_min":60}│
└──────────┴──────────────┴──────────────────────────────────┘

Однако, если несколько отношений имеют одно и то же свойство, тогда этот подход не дает вам никакого контроля над тем, с каким из них вы в итоге окажетесь.

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