2017-02-22 52 views
2

У меня есть график с книгами, главами и персонажами. Книги содержат главы, а главы - символы. Я хочу написать запрос, показывающий мне 10 персонажей, которые появляются в большинстве книг, вместе с книгами, которые они появляются.Запрос, чтобы показать отношения второй степени (косвенные) в Neo4j

Предположим, что моя проблема немного проще, я могу легко написать запрос, показывающий мне 10 символов, которые появляются в большинстве глав:

MATCH (chapter)-[:MENTIONS]->(character) 
RETURN character, 
COLLECT(chapter) as chapters 
ORDER BY SIZE(chapters) DESC 
LIMIT 10 

Этот запрос выше работает нормально. Теперь я пытаюсь написать подобный запрос, который показывает книги, а не главы:

MATCH (book)-[:CONTAINS]->(chapter)-[:MENTIONS]->(character) 
RETURN character, 
COLLECT(book) as books 
ORDER BY SIZE(books) DESC 
LIMIT 10 

Этот запрос кажется, работает хорошо, но это только сообщает кучу персонажей книг и без каких-либо отношений, потому что нет никакого прямого отношения между книгами и персонажами. Может Neo4j вывести эти косвенные связи и показать их в запросе без меня, чтобы изменить данные и вручную вставить для каждого шаблона

(book)-[:CONTAINS]->(chapter)-[:MENTIONS]->(character) 

новые отношения

(book)-[:TALKS_ABOUT]->(character) 

?

+0

Какие отношения вам нужны в результате запроса? –

+0

Я немного смущен ... результаты вашего запроса должны показать персонаж и коллекцию книг, которые они появились в порядке заказанного количества книг, в которые они появились (хотя вам может понадобиться книга COLLECT (DISTINCT)) как книги', чтобы избавиться от дубликатов в ваших коллекциях). Вы говорите, что он сообщает персонажи и книги без каких-либо отношений, но явно есть косвенные отношения, о чем свидетельствует ваш матч. Что в результатах не работает для вас? – InverseFalcon

+0

@stdob: Мне нужен тип отношений, который не находится в модели, и что я бы хотел избежать добавления вручную, как я сказал в примере в последнем абзаце. Отношения должны показывать связь между персонажами и книгами. – st1led

ответ

4

Это похоже, что вам нужны виртуальные отношения. Вы можете попробовать apoc.create.vRelationship:

MATCH (book)-[:CONTAINS]->(chapter)-[:MENTIONS]->(character) 
WITH character, 
    COLLECT(distinct book) as books 
    ORDER BY SIZE(books) DESC LIMIT 10 
UNWIND books as book 
CALL apoc.create.vRelationship(book,'TALKS_ABOUT',{}, character) yield rel 
RETURN character, collect(rel) as rels 
+0

Именно то, что я искал! Я не знал об этом плагине Neo4j. – st1led

+0

@ st1led Настоятельно рекомендуется изучить эту библиотеку: многие проблемы, которые невозможно решить с помощью 'cypher', могут быть решены с помощью' apoc'. –