Конвейер результата от одного запроса к другому в шифре Neo4j - PullRequest
0 голосов
/ 28 февраля 2019

Следующий запрос вернет список исследователей с соответствующим списком статей, которые они написали.Рядом с каждым документом указано количество ссылок на каждый документ, полученных другими документами.

MATCH (p:Paper) - [c:CITED_BY] -> (p2:Paper)
MATCH (p) - [w:WRITTEN_BY] -> (a:Author)
WITH a, p, count(c) as numCitations
ORDER BY a.authorName
RETURN a.authorName, p.paperTitle, numCitations

Следующий запрос предназначен для возврата того же списка авторов, но на этот раз я хочу узнать изцитаты, которые его / ее документы получили в общей сложности, что было наименьшим количеством цитат.Посмотрите, что здесь мне нужен параметр numCitations, полученный из предыдущего запроса (я собираюсь просканировать минимальное число в столбце!)

MATCH (p:Paper) - [c:CITED_BY] -> (p2:Paper)
MATCH (p) - [w:WRITTEN_BY] -> (a:Author)
WITH a, count(c) as numCit
ORDER BY a.authorName
RETURN a.authorName, min(numCitations)

Это что-то вроде этого:

Query 1
Author    Paper     numCitations
Alan      A         8
Alan      B         6
Alan      C         4
Alan      D         2 (this is the minimum for Alan's papers)

Query 2
Author   min(numCitations)
Alan     2 (I do not know how to get this number in Neo4j)

В конце я хочу вычислить h-индекс каждого автора (но сначала мне нужен этот ввод).Спасибо !!!

1 Ответ

0 голосов
/ 28 февраля 2019

Похоже, вы близки, вам просто нужно убедиться, что вы используете ту же переменную, что и ранее (numCit), и убедиться, что ваш расчет для numCit соответствует цитированию на бумагу на автора,поэтому вам нужно включить p в ваше предложение WITH, поскольку агрегаты сгруппированы по переменным, не относящимся к агрегации.

Также будет более эффективно использовать размер () отношений: CITED_BY, а нечем помещать их в ваш шаблон, так как это использует более эффективный расчет степени (узлы знают количество связей по типу / направлению), однако вы можете сделать это ТОЛЬКО если только: Узлы бумаги могут ссылаться друг на друга (если есть другие типыузлы, которые могут ссылаться на статьи, тогда вы не можете сделать эту оптимизацию).Это также гарантирует, что вы примете во внимание документы, которые не имеют ссылок.

Ваш запрос будет выглядеть примерно так:

MATCH (p:Paper)-[:WRITTEN_BY]->(a:Author)
WITH a, p, size((p)-[:CITED_BY]->()) as numCit
WITH a, min(numCit) as minCitations
RETURN a.authorName as authorName, minCitations
ORDER BY a.authorName

РЕДАКТИРОВАТЬ

Для возврата обоихминимальное количество цитат для автора, а также строка на статью и количество цитат, вам нужно будет собрать бумагу вместе с ее количеством цитат одновременно с вычислением минимума (поэтому переменная a: Authorявляется единственной неагрегирующей переменной в области видимости).Тогда вы сможете РАСКРЫТЬ коллекцию и спроецировать:

MATCH (p:Paper)-[:WRITTEN_BY]->(a:Author)
WITH a, p, size((p)-[:CITED_BY]->()) as numCit
WITH a, min(numCit) as minCitations, collect(p {.title, numCit}) as papers
UNWIND papers as paper
RETURN a.authorName as authorName, minCitations, paper.title as title, paper.numCit as numCit
ORDER BY authorName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...