2015-02-25 2 views
3

У меня есть график, представленный на следующие файлы:Вставка большого граф данных в Neo4j с использованием py2neo WriteBatch

  • VertexLabel.txt -> каждая строка содержит свойство для каждой вершины.
  • EdgeLabel.txt -> каждая строка содержит свойства для каждого ребра.
  • EdgeID.txt -> каждая строка содержит 3 выделенных целых числа, которые соответствуют индексам в файлах меток: source_index target_index edge_index.

Существует приблизительно 44 К вершин с краями 240 КБ. Я пытаюсь использовать neo4j.Writebatch для вставки данных графа.

from py2neo import Graph, neo4j, node, rel 

graph_db = Graph() 
nodes = {} 
batchNodes = {} 
edges = {} 
edgeList = [] 

# Read vertex label file into nodes, where node[i] is indexed according to the order the nodes appear in the file. 
# Each entry is of type node, e.g. node("FILM", title = "Star Trek"), node("CAST", name = "William Shatner") 
... 

# Read edge label file into edges, where edges[i] is indexed according to the order the edges appear in the file. 
# Each entry is a tuple (edge_type, edge_task), e.g. ("STAFF", "Director") 
... 

# Read edge id file into edgeList 
# Each entry is the tuple (source_index, target_index, edge_index), e.g. (1, 4, 8) 
... 

# Iterate nodes, store in graph 
# Note, store result of batch.create into batchNodes 
batch = neo4j.WriteBatch(graph_db) 
count = 0 
for n in nodes: 
    batchNodes[n] = batch.create(nodes[n]) 
    count += 1 

    # Submit every 500 steps 
    if count % 500 == 0: 
     count = 0 
     batch.submit() 
     batch = neo4j.WriteBatch(graph_db) 

# Submit remaining batch 
batch.submit() 

# Iterate edgeList, store in graph 
batch = neo4j.WriteBatch(graph_db) 
count = 0 
for i, j, k in edgeList: 
    # Lookup reference in batchNodes 
    source = batchNodes[i] 
    target = batchNodes[j] 
    edge = edges[k] 
    batch.create(rel(source, edge[0], target, {"task": edge[1]})) 
    count += 1 

    # Submit every 500 steps 
    if count % 500 == 0: 
     count = 0 
     batch.submit() 
     batch = neo4j.WriteBatch(graph_db) 

# Submit remaining batch 
batch.submit() 

Я получаю следующее сообщение об ошибке:

Traceback (most recent call last): File "test4.py", line 87, in <module> 
    batch.create(rel(source, edge[0], target, {"task": edge[1]})) File "C:\Python34\lib\site-packages\py2neo\batch\write.py", line 181, in create 
    start_node = self.resolve(entity.start_node) File "C:\Python34\lib\site-packages\py2neo\batch\core.py", line 374, in resolve 
    return NodePointer(self.find(node)) File "C:\Python34\lib\site-packages\py2neo\batch\core.py", line 394, in find 
    raise ValueError("Job not found in batch") ValueError: Job not found in batch 

Я полагаю, что batchNodes не на самом деле, содержащая правильную ссылку на узлы, которые я хочу для поиска для добавления отношения (возможно переинициализацией партии объекта недействительным Рекомендации). В этом случае, как мне выполнить эту задачу?

Я использую Neo4j 2.1.7 (Community Edition) и py2neo 2.0.4.

ответ

2

Для импортирует CSV, как данные, которые я рекомендовал бы так Neo4j 2,1 НАГРУЗКИ CSV

load csv with headers from "file://...VertexLabel.txt" as row 
where has(row.name) 
create (:Actor {row.name}) 

так же вы можете загрузить ваши отношения

создать индекс: Актер (имя); создать индекс на: Фильм (название);

load csv with headers from "file://...EdgeID.txt" as row 
match (a:Actor {row.name}) 
match (m:Movie {row.title}) 
create (a)-[:ACTED_IN]->(m) 

так Neo4j 2.2 вы можете также использовать Neo4j-импортировать супер быстрый инструмент для импорта данных в формате CSV, который также поддерживает Ид группы, обеспечивая этикетки и типы в формате CSV и т.д.

см: http://neo4j.com/developer/guide-importing-data-and-etl/ и : http://neo4j.com/developer/guide-import-csv/

+4

Если информация не в формате CSV, как можно ускорить процесс вставки узлов с использованием пакетной вставки в py2neo? Думаю, в этом и был смысл этого вопроса. – NumenorForLife

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