2016-11-24 7 views
1

Я использую Neo4j rest api для создания структуры графика с большим количеством узлов и отношений. Я использовал следующий формат запроса cypher, чтобы отправить партию узлов и их отношения в один почтовый запрос.Данные, отправленные через Neo4j rest api, не сохраняются

UNWIND [[0,1], [0,6309]] AS pair 
MATCH (n {name: pair[0]}), (m {name: pair[1]}) 
CREATE (n)-[:X]->(m) 

Я чтение данных из файла размером 1 Гб и загрузив порционно в Neo4j данных. Я получаю код ответа 200 для всех запросов, которые я отправляю, но когда я проверил размер {$NEO4J_HOME}/data/databases/graph.db, он показывает только размер 244K. Также команда du -hc *store.db* внутри graph.db показала, что все размеры nodestore.db, relationshipstore.db и propertystore.db равны 0. Почему данные, которые загружаются через rest api, не записываются в файлы в графе DB? Любая помощь будет высоко оценен.

Выход из du -hc *store.db*

0  neostore.nodestore.db 
4.0K neostore.nodestore.db.id 
8.0K neostore.nodestore.db.labels 
4.0K neostore.nodestore.db.labels.id 
0  neostore.propertystore.db 
8.0K neostore.propertystore.db.arrays 
4.0K neostore.propertystore.db.arrays.id 
4.0K neostore.propertystore.db.id 
8.0K neostore.propertystore.db.index 
4.0K neostore.propertystore.db.index.id 
8.0K neostore.propertystore.db.index.keys 
4.0K neostore.propertystore.db.index.keys.id 
0  neostore.relationshipstore.db 

Это полный запрос, отправленный на Neo4j апи отдыха с помощью клиента джерси.

Client client = Client.create(); 
client.addFilter(new HTTPBasicAuthFilter(user, password)); 
WebResource cypherResource = client.resource("http://localhost:7474/db/data/cypher"); 
ClientResponse cypherResponse = cypherResource.accept(MediaType.APPLICATION_JSON) 
      .type(MediaType.APPLICATION_JSON_TYPE).entity(query).post(ClientResponse.class); 

Пример запроса устанавливается в качестве объекта:

{"query":"UNWIND [[0,1], [0,6309]] AS pair 
MATCH (n {name: pair[0]}), (m {name: pair[1]}) CREATE (n)-[:X]->(m)"} 
+0

Покажите нам полный запрос (метод, путь, заголовки, тело), ​​отправленный в Neo4j. Может быть, вы никогда не совершаете транзакцию? –

+0

Я обновил вопрос с полным запросом, который я отправляю в Neo4j. Спасибо за вашу помощь. – sathya

ответ

0

Я получил отвлекаться от контекста REST, когда на самом деле запрос не будет работать в любом контексте (REST API, Neo4j браузер, neo4j- оболочка и т. д.).

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

Чтобы создать узлы, которые еще не существуют, а затем связь, вы должны использовать MERGE вместо MATCH. Вы должны также установить метку на узлах, а также для повышения производительности и корректности, создать unicity constraint на name собственности для этого ярлыка (он будет создавать индекс одновременно):

CREATE CONSTRAINT ON (n:Node) ASSERT n.name IS UNIQUE; 

затем:

UNWIND [[0,1], [0,6309]] AS pair 
MERGE (n:Node {name: pair[0]}) 
MERGE (m:Node {name: pair[1]}) 
CREATE (n)-[:X]->(m) 

(или используйте MERGE для отношений, если в файле могут быть дубликаты пар).

Знаете ли вы о предложении Cypher LOAD CSV, которое может импортировать данные быстрее, чем ваши удаленные запросы, даже если вы партируете пар вручную?

+0

спасибо за ваше решение. Я пробовал этот подход и, похоже, работает правильно. Файлы neostore обновляются из данных, которые я отправляю, и я использую несколько потоков для одновременной публикации данных в пакетном режиме. Однако для набора данных с размером 1 Гб потребовалось почти 3 часа и все еще его загрузка. Я знаю опцию «LOAD CSV», но мне нужно использовать остальные api, чтобы сравнить производительность neo4j с другой графической базой данных для потоковых графиков. – sathya

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