2015-07-16 3 views
2

Я разбираю биткойн-блок-цепочку, вся идея состоит в том, чтобы построить граф узлов, который выглядит так (адрес) - [выкуплено] -> (tx) - [отправлено] -> (адрес), поэтому я вижу, как адреса биткойнов связаны друг с другом. Проблема заключается в времени выполнения, иногда требуется несколько минут, чтобы импортировать только одну транзакцию. Кроме того, некоторые из этих запросов слишком длинны, как и несколько тысяч строк, и не будут выполняться вообще. Я прочитал несколько статей о том, как оптимизировать запросы соответствия, но ничего не нашел о создании и объединении. Я видел несколько ребята, которые рекомендуют использовать UNWIND и отправлять как можно больше данных в качестве параметров, чтобы сделать запросы короче, но я понятия не имею, как реализовать это в моем запросе.Нужна помощь в оптимизации neo4j cypher Запросы CREATE и MERGE

Вот пример моего запроса: http://pastebin.com/9S0kLNey

+0

Я думаю, что вы слишком много спрашиваете –

ответ

1

Вы можете попробовать использовать следующий простой запрос, передавая строковое parameters «хэш», «время», «блок», и «confs»; и параметр коллекции под названием «данные»:

CREATE (tx:Tx {hash: {hash}, time: {time}, block: {block}, confirmations: {confs}}) 
FOREACH(x IN {data} | 
    MERGE (addr:Address {address: x.a}) 
    CREATE (addr)-[:REDEEMED {value: x.v}]->(tx) 
); 

Значения, используемые для параметров строки, должны быть очевиденными.

Каждый элемент «данных» будет представлять собой карту, содержащую адрес («a») и значение («v»). Например, вот фрагмент из коллекции «данных», который будет соответствовать данным в запросе выборки:

[ 
    {a: "18oBAMgFaeFcZ5bziaYpUpsNCJ7G8EgH8g", v: "240"}, 
    {a: "192W3HUVDyrp6ewvisHSijcx9f5ZoarrwX", v: "410"}, 
    {a: "18tnEFy4usZvpMZLnjBFPjbmLKEzqPz958", v: "16.88"}, 
    ... 
] 

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

+0

Спасибо за очень подробный ответ, я попробую это и опубликую результаты здесь. Также у меня есть 2 типа relathionships: (addr) - [: REDEEMED {value}] -> (tx) и (tx) - [: SENT {value}] -> (addr). Так что мне нужно сделать 2 разных коллекций для этого запроса? Как data_sent и data_redeemed с 2 FOREACH в моем запросе, или, может быть, я могу передать оба в одной коллекции, используя один foreach? – rPod

+0

Если каждое отношение SENT всегда совпадает с отношением «REDEEMED» (кроме направленности), вам не нужны оба типа отношений. Связь может быть пройдена в любом направлении. – cybersam

+0

ОК, просто попробовал это, и кажется, что я убежден в том же выпуске [ссылка] (http://stackoverflow.com/questions/26853532/cypher-foreach-merge-not-hitting-the-index) Foreach is очень медленно, я должен ждать полчаса и все еще бежать. Точно такой же запрос, но с UNWIND вместо foreach ececuting в 70 мс, но я не нашел, как раскрутить несколько коллекций (для отношений SENT и REDEEMED). Время выполнения моего предыдущего запроса с теми же данными составляло ~ 85 мс. – rPod

 Смежные вопросы

  • Нет связанных вопросов^_^