Neo4j - как включить стартовый узел в мой запрос? - PullRequest
0 голосов
/ 20 мая 2019

Я пытаюсь создать механизм рекомендаций для библиотечной системы.

Это моя схема БД:

db schema

Моя отправная точка - LoanerCard.Затем поток должен выглядеть следующим образом: получить все копии -> получить материал -> получить все копии материала (включая оригинал) -> получить копию LoanerCard -> получить все одолженные копии -> вернуть имя материалакопии + агрегированное число, чтобы показать силу рекомендации.

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

MATCH (L:LoanerCard {Barcode:"10007"})-[:LOANED]->(myLoans)-[:COPY_OF]- 
(masterMaterial),
(masterMaterial)<-[:COPY_OF]-(allCopies),
(allCopies)<-[:LOANED]-(coLoaners),
(coLoaners)-[r:LOANED]->(theirCopies),
(theirCopies)-[:COPY_OF]-(materials)
RETURN materials.Title as Recommended, count(*) as Strength ORDER BY Strength DESC

Моя проблема в том, что когда я пересекаю график не включает оригинальную копию и смежные карты Loaner, которые, по сути, охватывают только область, обведенную красным, и никогда не доходят до карт LoanerCard 10817 и 10558

.это включает их?

enter image description here

1 Ответ

1 голос
/ 20 мая 2019
Предложение

A MATCH автоматически отфильтровывает повторяющиеся отношения. Поэтому, чтобы дважды пересечь одни и те же отношения, вам нужно разделить ваше предложение MATCH на два.

Попробуйте это:

MATCH (:LoanerCard {Barcode:"10007"})-[:LOANED]->()-[:COPY_OF]-(masterMaterial)
MATCH (masterMaterial)<-[:COPY_OF]-()<-[:LOANED]-()-[:LOANED]->()-[:COPY_OF]-(materials)
RETURN materials.Title as Recommended, count(*) as Strength ORDER BY Strength DESC
...