Вставка больших графических данных в 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.


person Aaron    schedule 25.02.2015    source источник
comment
смогли ли вы пройти через это. если да, не могли бы вы поделиться?   -  person gB08    schedule 08.07.2020


Ответы (1)


Для импорта данных в формате CSV я бы рекомендовал, начиная с Neo4j 2.1 LOAD CSV

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

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

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

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-import — сверхбыстрый инструмент для импорта данных csv, который также поддерживает группы id, предоставляя метки и типы в csv и т. д.

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

person Michael Hunger    schedule 28.02.2015
comment
Если информация не в формате CSV, как можно ускорить процесс вставки узлов с помощью пакетной вставки в py2neo? Думаю, в этом и был смысл этого вопроса. - person NumenorForLife; 03.06.2015
comment
@NumenorForLife технология существует уже как минимум 10 лет, и у них до сих пор нет ответа - person Tommaso Guerrini; 24.05.2021