Загрузка CSV в Neo4j на Azure - PullRequest
0 голосов
/ 02 марта 2020

Neo4j работает на Azure. Я могу загрузить данные, используя python и серию операторов create:

create (n:Person) return n

Я могу успешно выполнить запрос, используя python.

При использовании LOAD CSV требуется файл в каталоге импорта Neo4j. Я нашел этот каталог, но перемещение файла в него заблокировано. Я также попытался поместить файл в доступный каталог, но затем не могу понять, как обратиться к пути в операторе LOAD CSV.

Эта LOAD выдает ошибку, поскольку файл не может попасть в каталог импорта Neo4j :

USING PERIODIC COMMIT 10000 LOAD CSV WITH HEADERS FROM 'file:///FTDNATree.csv' AS line FIELDTERMINATOR '|' merge (s:SNPNode{SNP:toString(line.Parent)})

Этот оператор не находит файл и выдает ошибку: EXTERNAL файл не найден

USING PERIODIC COMMIT 10000 LOAD CSV WITH HEADERS FROM 'file:///{my directory path/}FTDNATree.csv' AS line FIELDTERMINATOR '|' merge (s:SNPNode{SNP:toString(line.Parent)})

Даже если python и neo4j находятся в одной группе ресурсов, это разные виртуальные машины. Кажется, проблема заключается в совместимости двух виртуальных машин?

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

Решение НЕ было хорошо задокументировано в одном месте. Но вот что развивалось методом проб и ошибок и что работает.

  1. Я создал учетную запись хранения в ресурсе
  2. Создал каталог, доступный из кода, в который был помещен загружаемый файл.
  3. Добавлен контейнер, который называется neo4j-import
  4. Затем я могу передать файл в контейнер в виде BLOB-объекта (т. Е. * .Csv-файла)
  5. Вам нужно сделать файл доступным. Это включает создание токена sas и присоединение его к URL-адресу, указывающему на контейнер и файл (см. Код python, чтобы сделать это ниже).
  6. Этот URL-адрес можно проверить в локальном браузере. Он должен получить файл, который недоступен без маркера sas
  7. Этот URL-адрес используется в операторе LOAD CSV и успешно загружает базу данных Neo4j

Код для шага 4; Прошу прощения из-за проблем с вставкой здесь.

          from azure.storage.blob import BlobServiceClient, BlobClient, 
    ContainerClient, generate_account_sas, ResourceTypes, AccountSasPermissions

    def UploadFileToDataStorage(FileName,
    UploadFileSourceDirecory=ImportDirectory,BlobConnStr=AzureBlobConnectionString,
Container="neo4j-import"):
           #uploads file as blob to data storage
           #https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-python  #upload-blobs-to-a-container
           blob_service_client = BlobServiceClient.from_connection_string(BlobConnStr)
           blob_client = blob_service_client.get_blob_client(container=Container, blob=FileName)
           with open(UploadFileSourceDirecory + FileName, "rb") as data:
               blob_client.upload_blob(data)

Код ключа python (шаг 5 выше).

    def GetBlobURLwithSAS(FileName,Container="neo4j-import"):
    #https://pypi.org/project/azure-storage-blob/
    #https://docs.microsoft.com/en-us/python/api/azure-storage-blob/azure.storage.blob.blobserviceclient?view=azure-python
    #generates sas token for object blob so it can be consumed by another process
    sas_token = generate_account_sas(
    account_name="{storage account  name}",
    account_key="{storage acct key}",
    resource_types=ResourceTypes(service=False, container=False, object=True),
    permission=AccountSasPermissions(read=True),
    expiry=datetime.utcnow() + timedelta(hours=1))
    return "https://{storage account name}.blob.core.windows.net/" + Container + "/" + FileName + "?" + sas_token

Оператор LOAD выглядит следующим образом и не использует файл: /// префикс:

LOAD CSV WITH HEADERS FROM '" + {URL from above} + "' AS line FIELDTERMINATOR '|'{your cypher query for loading csv}

Надеюсь, это поможет другим ориентироваться в этом сценарии!

0 голосов
/ 03 марта 2020

Если у вас есть доступ к neo4j.conf, вы можете изменить значение dbms.directories.import, чтобы оно указывало на доступный каталог

См. https://neo4j.com/docs/operations-manual/current/reference/configuration-settings/#config_dbms .directories.import

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...