使用 Apache AGE 加载 CSV 文件,无需访问本地路径

本文介绍了一种在 Apache AGE 中加载 CSV 文件的替代方案,避免了直接访问本地文件系统路径的需求。通过在服务器端创建一个文件上传接口,将 CSV 文件存储在服务器上,然后使用服务器上的文件路径加载数据到 AGE 数据库,从而解决了 Web 浏览器安全限制带来的问题。

在使用 Apache AGE 构建图应用时,经常需要从 CSV 文件中加载数据以创建节点和边。AGE 提供了 load_labels_from_file 函数来完成这项任务。然而,该函数需要指定 CSV 文件在本地文件系统中的路径。

load_labels_from_file('',
                      '

由于 Web 浏览器的安全限制,JavaScript 代码通常无法直接访问用户的本地文件系统路径。因此,直接在浏览器端调用 load_labels_from_file 函数是不现实的。

解决方案:服务器端文件上传

为了解决这个问题,可以采用以下方案:

  1. 在服务器端创建一个文件上传接口。 该接口接收客户端上传的 CSV 文件,并将其存储在服务器上的特定目录中。
  2. 接口返回服务器端存储的文件路径。 上传成功后,服务器需要返回该 CSV 文件在服务器上的完整路径。
  3. 在 AGE 查询中使用服务器端路径。 客户端获取到服务器端路径后,可以将其传递给 load_labels_from_file 函数,从而将 CSV 数据加载到 AGE 数据库中。

示例代码 (Node.js)

以下是一个使用 Node.js 和 Express 框架实现的简单文件上传接口示例:

const express = require('express');
const multer = require('multer');
const path = require('path');

const app = express();
const port = 3000;

// 设置文件存储位置
const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, 'uploads/'); // 文件存储在 uploads 目录
  },
  filename: function (req, file, cb) {
    const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
    cb(null, file.fieldname + '-' + uniqueSuffix + path.extname(file.originalname)); // 生成唯一文件名
  }
});

const upload = multer({ storage: storage });

// 创建上传接口
app.post('/upload', upload.single('csvFile'), (req, res) => {
  if (!req.file) {
    return res.status(400).send('No file uploaded.');
  }

  const filePath = req.file.path; // 获取文件路径
  console.log(`File uploaded to: ${filePath}`);
  res.send({ filePath: filePath }); // 返回文件路径
});

app.listen(port, () => {
  console.log(`Server listening at http://localhost:${port}`);
});

客户端代码 (JavaScript)

以下是一个使用 JavaScript fetch API 上传文件的示例:

async function uploadFile() {
  const fileInput = document.getElementById('csvFileInput');
  const file = fileInput.files[0];

  if (!file) {
    alert('Please select a CSV file.');
    return;
  }

  const formData = new FormData();
  formData.append('csvFile', file);

  try {
    const response = await fetch('/upload', {
      method: 'POST',
      body: formData,
    });

    if (response.ok) {
      const data = await response.json();
      const filePath = data.filePath;
      console.log(`File path on server: ${filePath}`);
      // 使用 filePath 调用 load_labels_from_file 函数
      // 例如: executeAgeQuery(`load_labels_from_file('my_graph', 'my_label', '${filePath}', false)`);
    } else {
      console.error('Upload failed:', response.status);
    }
  } catch (error) {
    console.error('Error uploading file:', error);
  }
}

注意事项:

  • 安全性: 请确保服务器端的文件上传接口具有适当的安全措施,以防止恶意文件上传和潜在的安全漏洞。例如,可以对上传的文件进行类型检查和病毒扫描。
  • 错误处理: 在客户端和服务器端都应添加适当的错误处理机制,以便在上传过程中出现问题时能够及时通知用户。
  • 文件存储: 选择合适的文件存储策略,例如使用云存储服务或数据库来存储上传的文件。
  • 路径处理: 确保在 AGE 查询中正确转义服务器端返回的文件路径,以避免 SQL 注入等安全问题。

总结

通过在服务器端创建一个文件上传接口,可以有效地解决 Web 浏览器安全限制带来的问题,从而允许用户上传 CSV 文件并将其加载到 Apache AGE 数据库中,而无需直接访问本地文件系统路径。 这种方法提供了一种安全且灵活的方式来构建基于 AGE 的图应用。