2015-04-15 2 views
0

Я хочу рассчитать между собой на очень большом графике в neo4j, используя py2neo.py2neo запрос для вычисления ошибки между значениями

Я использую Cypher запрос, как это:

MATCH p=allShortestPaths((source:DOLPHIN)-[*]-(target:DOLPHIN)) 
WHERE id(source) < id(target) 
AND length(p) > 1 
UNWIND nodes(p)[1..-1] as n 
RETURN n.name, count(*) as betweenness 
ORDER BY betweenness DESC 

Это работает для малого графа, но не работает для большого графа с 1 миллиона узлов. Я передал этот запрос с помощью py2neo.

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

File "/usr/local/lib/python2.7/dist-packages/py2neo/cypher/core.py", line 111, in execute 
    results = tx.commit() 
    File "/usr/local/lib/python2.7/dist-packages/py2neo/cypher/core.py", line 306, in commit 
    return self.post(self.__commit or self.__begin_commit) 
    File "/usr/local/lib/python2.7/dist-packages/py2neo/cypher/core.py", line 261, in post 
    raise self.error_class.hydrate(error) 
    py2neo.cypher.error.statement.ExecutionFailure: The statement has been closed. 

Я искал много о нем. Пожалуйста, помогите мне с этим

+0

Возможно, сервер базы данных перегружен запросом. Попробуйте запустить этот процесс последовательно, ограничивая диапазон узлов, пройденных на каждом шагу. Я не решаюсь предложить решение, потому что я не совсем уверен, что вы агрегируете. Либо ограничивающие узлы, либо пути, вероятно, будут давать разные результаты для каждого вызова. Но я бы посоветовал вам не выполнять полные графические запросы в Neo4j. – Guilherme

+0

Привет, спасибо за ваше предложение. У меня есть данные авторов научных работ, которые имеют одинаковую область. Из этого я сделал график соавторов. Теперь я хочу найти лучших авторов в сети, вычислив междоусобие каждого автора. можете ли вы предложить хороший способ для этого, используя некоторые запросы neo4j, потому что этот запрос не работает? –

+0

Для хорошей рекомендации мне нужно знать вашу схему. Если у вас есть что-то вроде: (автор) - [: НАПИСАЛ] -> (бумага) Если вы определили лучших авторов, как те, которые написаны большинство документов, , то вы можете выполнить запрос так: MATCH (автор: Автор) - [r: WROTE] - (x: Бумага) RETURN author.name AS имя, COUNT (r) AS n ORDER BY n DESC LIMIT 10 – Guilherme

ответ

0

Я не могу комментировать алгоритм/подход, который вы используете для ранжирования авторов. В конечном итоге жесткий запрос, который вы используете, представляет собой полный поиск по графу с некоторой агрегацией. Neo4j не был предназначен для таких случаев. По мере увеличения ваших данных выполнение запроса будет сложнее.

В идеале запрос должен пересекать только небольшую часть графика. Итак, для вашего случая, вместо того, чтобы спрашивать, кто является самым популярным, вы можете спросить, какой рейтинг для каждого автора, по каждому запросу. Выполнение этого для всех из них, по одному, и ранжирование их самих, могло бы работать лучше здесь. Если вы не используете другой подход, например, ограничиваете диапазон соседних узлов для перемещения или длину самого длинного пути или даже оба. Но я подозреваю, что это повлияет на ваш результат.

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

Моделирование с Neo4j:

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

Cheers

+0

Большое спасибо ... :) –