2016-05-24 4 views
2

У меня есть 2 файла csv: Entity, с 2.8M records и Rships, с 4.2M records. Entity имеет список ENT_ID и PARENTID. Если ENT_ID имеет PARENTID '0', это означает, что нет родителя. Если да, то это будет один из ENT_ID сверху. Мне нужно создать связь ENT_ID и PARENTID. Я попробовал загрузить это с помощью инструмента импорта, доступного для сообщества сообщества Neo4j2.3.4, однако я продолжал получать очень много ошибок. В итоге мне удалось загрузить его с помощью запроса csv cypher load.neo4j создать отношения, не дающие результата

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:///C:/...(read file address here)/Entities.txt" AS Entity FIELDTERMINATOR '|' 
CREATE (n:Entity{ENT_ID: Entity.ENT_ID,NAME: Entity.NAME,ENTRYTYPE: Entity.ENTRYTYPE, PARENTID: Entity.PARENTID,ENTRYCATEGORY: Entity.ENTRYCATEGORY,ENTRYSUBCATEGORY: Entity.ENTRYSUBCATEGORY,COUNTRY: Entity.COUNTRY,PWC_ADL_ID: Entity.PWC_ADL_ID }) 

Я создал отношения между ParentID и ENTID, используя следующие:

PROFILE 
MATCH(Entity) 
MATCH (a:Entity {ENT_ID : Entity.ENT_ID}) 
WITH Entity, a 
MATCH (b:Entity {ENT_ID : Entity.PARENTID}) 
WITH a,b 
MERGE (a)-[r:RELATION]->(b) 

Теперь я загрузил файл CSV для отношений, как:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:///C:/.../EntitiesRelationships.txt" AS Rships FIELDTERMINATOR '|' 
CREATE (n:Rships{RID: Rships.RID,Ent_IDParent: Rships.Ent_IDParent,Ent_IDChild: Rships.Ent_IDChild, RelationID: Rships.RelationID }) 

Я создал индекс на обоих томов CSV :

CREATE INDEX ON :Entity(ENT_ID) 

CREATE INDEX ON :Rships(Ent_IDParent) 
CREATE INDEX ON :Rships(Ent_IDChild) 

До здесь выше код работает нормально, хотя она занимает почти день, чтобы сделать так:

Теперь, когда я пытаюсь создать отношения с помощью запроса:

PROFILE 
Match(Rships) 
MATCH(a:Rships {ENT_IDParent: Rships.ENT_IDParent}) 
WITH Rships, a 
MATCH(b:Rships {ENT_IDParent: Rships.ENT_IDChild}) 
WITH a,b 
MERGE (a)-[r:RELATION]->(b) 

Этот запрос продолжает работать в течение примерно часа без каких-либо результатов.

Справка будет принята с благодарностью.

Благодаря

ответ

1

этикетки, свойства и отношения-типа чувствительны к регистру. У вашего индекса разные варианты написания, чем свойства в вашем заявлении.

Вы также должны посмотреть ваши заявления с помощью EXPLAIN или PROFILE, тогда вы сразу увидите его.

Для второго оператора я также использовал бы LOAD CSV снова, чтобы управлять поиском сущностей, чтобы вы получали периодическую фиксацию.

В целом ваш импорт не должен занимать больше нескольких минут.

// create unique constraint 
CREATE CONSTRAINT ON (n:Entity) ASSERT n.ENT_ID IS UNIQUE; 

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:///C:/...(read file address here)/Entities.txt" AS row FIELDTERMINATOR '|' 
CREATE (n:Entity {ENT_ID: row.ENT_ID,NAME: row.NAME,ENTRYTYPE: row.ENTRYTYPE, PARENTID: row.PARENTID, ENTRYCATEGORY: row.ENTRYCATEGORY, ENTRYSUBCATEGORY: row.ENTRYSUBCATEGORY, COUNTRY: row.COUNTRY, PWC_ADL_ID: row.PWC_ADL_ID }); 
// you can also use this if you want to set all properties: 
// CREATE (n:Entity) SET n = row 

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:///C:/...(read file address here)/Entities.txt" AS row FIELDTERMINATOR '|' 
MATCH (a:Entity {ENT_ID : row.ENT_ID}) 
MATCH (b:Entity {ENT_ID : row.PARENTID}) 
MERGE (a)-[:PARENT]->(b); 

Почему вы создаете отношения как узлы, а не как взаимоотношения, что не имеет смысла для меня ???

Вместо:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:///C:/.../EntitiesRelationships.txt" AS row FIELDTERMINATOR '|' 
CREATE (n:Rships {RID: row.RID,Ent_IDParent: row.Ent_IDParent, Ent_IDChild: row.Ent_IDChild, RelationID: row.RelationID }); 

Я хотел бы сделать:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:///C:/.../EntitiesRelationships.txt" AS row FIELDTERMINATOR '|' 
MATCH (a:Entity {ENT_ID : row.Ent_IDChild}) 
MATCH (b:Entity {ENT_ID : row.Ent_IDParent}) 
CREATE (a)-[:PARENT {RID: row.RID, RelationID: row.RelationID}]->(b); 

Я создал индекс обоих томов CSV:

CREATE INDEX ON :Entity(ENT_ID) 

CREATE INDEX ON :Rships(Ent_IDParent) 
CREATE INDEX ON :Rships(Ent_IDChild) 

До здесь выше код работает f иня, хотя она занимает почти день, чтобы сделать так:

Теперь, когда я пытаюсь создать отношения с помощью запроса:

// Вы также имели опечатку в этом запросе, соответствующие б также для родительского идентификатора

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:///C:/.../EntitiesRelationships.txt" AS row FIELDTERMINATOR '|' 
MATCH(a:Rships {Ent_IDParent: row.ENT_IDParent}) 
MATCH(b:Rships {Ent_IDChild: row.ENT_IDChild}) 
MERGE (a)-[:PARENT]->(b) 

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

MATCH(Entity) MATCH (a:Entity {ENT_ID : Entity.ENT_ID}) WITH Entity, a MATCH (b:Entity {ENT_ID : Entity.PARENTID}) WITH a,b MERGE (a)-[r:RELATION]->(b) 

Match(Rships) MATCH(a:Rships {ENT_IDParent: Rships.ENT_IDParent}) WITH Rships, a MATCH(b:Rships {ENT_IDParent: Rships.ENT_IDChild}) WITH a,b MERGE (a)-[r:RELATION]->(b) 
+0

Так что я в конечном итоге следующие тыс как вы уже упоминали. Он работал нормально. Так что для отношений. У меня есть 30 разных типов отношений, каждый из которых изображен на основе RelationID. Есть ли способ настроить ярлык для каждого типа отношений? также есть способ, которым я мог бы загрузить другую метку узла, которая содержит RelationID, тип отношения и тип соединения обеих таблиц. Большое спасибо за помощь. Очень ценю это. – Sharath

+0

Кроме того, импорт по-прежнему занимает около 35 минут, всего лишь для первого заявления. – Sharath