Статьи

Выпуск Neo4j 2.1.0 Milestone 1: импорт и плотность узлов

Этот пост был изначально написан Джимом Уэббером

Мы рады объявить о выпуске Neo4j 2.1 Milestone 1 , первой капли в графике выпуска 2.1, двойными целями которого являются производительность и производительность.

В этом выпуске мы улучшили опыт на обоих концах кривой обучения Neo4j. Что касается импорта данных, то теперь мы поддерживаем импорт CSV напрямую на языке запросов Cypher. Для больших плотно связанных графиков мы изменили способ хранения отношений в Neo4j, чтобы значительно ускорить навигацию по плотно связанным узлам в обычных случаях.

CSV Импорт в Cypher

Начать работу с Neo4j довольно легко, особенно после выпуска 2.0 со всеми его прелестями Cypher и WebUI. Но как только вы пройдете этап игры с небольшими графиками, вы, как правило, захотите загрузить большие объемы существующих данных в Neo4j.

Традиционно в этот момент вы искали инструменты импорта Neo4j и нашли множество вариантов  для ввода исходных данных в базу данных. Хотя определенно есть место для чрезвычайно высокопроизводительных программных инструментов вставки для огромных объемов данных, для графиков миллионов элементов — типичный размер для доказательства концепции — это, вероятно, излишне.

Из Neo4j 2.1 M01 импорт миллионов элементов данных — это просто загрузка CSV напрямую в Cypher  из файла или URL-адреса, например, так:

Рассматривать каждую строку как коллекцию (быстрее):

LOAD CSV FROM "file:///tmp/movies.csv" AS csvLine
MERGE (p:Person { name: csvLine[0]})
MERGE (m:Movie { title: csvLine[1]})
CREATE (p)-[:PLAYED { role: csvLine[2]}]->(m)


or a map:

LOAD CSV FROM "file:///tmp/movies.csv" WITH HEADERS AS csvLine
MERGE (p:Person { name: csvLine.name})
MERGE (m:Movie { title: csvLine.title})
CREATE (p)-[:PLAYED { role: csvLine.role}]->(m)

Обратите внимание, что в настоящее время это следует использовать только из оболочки neo4j, подключенной к работающему серверу Neo4j. 

Для достижения максимальной производительности вы можете дать Cypher подсказку о размере транзакции, чтобы после n обновлений транзакция была зафиксирована, как для сохранения обновлений в случае сбоя, так и для освобождения ресурсов, обеспечивая работоспособность ядра базы данных. Это легко объявить:

USING PERIODIC COMMIT

который фиксирует использование значений по умолчанию для каждых 10000 обновлений, или если значение по умолчанию не работает для вас, вы также можете изменить его, например,

USING PERIODIC COMMIT 500

to specify a particular number of updates (500 in this case) between commits.

If you’d like to read a fully-worked example, Chris Leishman has used the CSV import feature to create OpenDisclosure, a dataset that follows the contributions and expenditure of Oakland politicians created CSV data in the public domain.

New Store Format for Densely Connected Nodes

Sometimes in a domain you find that some nodes serve a far more important role in the graph leading to interesting topologies with highly localised dense knots. For example in social graphs we find that celebrities have many more fans (dense) than friends (sparse by comparison) and we can take advantage of the way those relationships are differently scaled to improve query performance. 

In this release we’ve added support to the Neo4j store to partition relationships incident on a node by type and direction. Therefore if you’re searching for the handful of celebrity friends amongst the legion of fans, your queries will be much faster since most relationships (between the celebrity and their fans) won’t be touched.

You won’t need to make any changes to your code to take advantage of this feature, but if you’re copying over an existing database you’ll have to set the allow_store_upgrade flag to true in your neo4j.properties file.

If you’ve got a densely connected domain, then try it out and let us have your performance feedback over on the Neo4j Google group.

Remember, milestones are for early access…

We want to get new features into your hands as early as we responsibly can. Milestones are all about feature feedback, so please download the release and tell us what you think at our Neo4j Google group.

…but they’re not for Production

Milestone releases don’t represent a stable platform for production use. We don’t certify them for production, and it may even be the case that in order to get some features released quickly, others are incomplete (for example, you can’t perform a rolling cluster upgrade with this milestone). So have fun with the milestone, but be safe!

Also upgrades between milestones (e.g. when they include store format changes) are not supported.

Start your engines

So if you’re ready to explore a little, head over to the Neo4j downloads page and get graphing!

Jim Webber for the Neo4j Team