【问题标题】:Load CSV into Neo4j and create nodes out of each row with relationship based on similarity?将 CSV 加载到 Neo4j 中并根据相似性从每行创建具有关系的节点?
【发布时间】:2021-12-27 16:36:42
【问题描述】:

我有一个包含大量列的 CSV 源,我想构建 2 个东西:

  1. 将 CSV 加载到我的 Neo4j 图表中,并将每一行转换为一个节点。
  2. 基于余弦相似度(高于某个阈值 alpha)建立节点之间的关系。 这是我已经为 (1) 所做的:

WITH "https://drive.google.com/u/0/ucid=1FRi5YmWNQJZ2xeTKNO4b12xYGOTWk1jL&export=download" AS data_url LOAD CSV WITH HEADERS FROM data_url AS requests

但它返回一个错误“查询不能以 LOAD CSV 结束(必须是 RETURN 或更新子句)”

我应该将数据转换为长格式(带有 data_key 和 data_value 列)并使用以下内容吗?:

// For each request (request_id), collect it's attributes into key-value pairs
WITH requests.request_id AS request_id,
    COLLECT([requests.data_key, requests.data_value]) AS keyValuePairs
WITH request_id,
     apoc.map.fromPairs(keyValuePairs) AS map

// Each request converts to a node with it's attributes:
MERGE (r:Requests {request_id:request_id})
SET r += map

// Show all nodes:
MATCH (n) RETURN n

【问题讨论】:

    标签: neo4j cypher neo4j-apoc


    【解决方案1】:

    您可以简单地使用RETURN 语句返回行吗?

    WITH "https://drive.google.com/u/0/ucid=1FRi5YmWNQJZ2xeTKNO4b12xYGOTWk1jL&export=download" AS data_url LOAD CSV WITH HEADERS FROM data_url AS requests
    RETURN * LIMIT 5
    

    我不知道 CSV 里面有什么,但我们假设它是一堆带有浮点值的不同列。使用LOAD CSV,您必须手动将所有值转换为浮点数。

    WITH "https://drive.google.com/u/0/ucid=1FRi5YmWNQJZ2xeTKNO4b12xYGOTWk1jL&export=download" AS data_url LOAD CSV WITH HEADERS FROM data_url AS requests
    CREATE (r:Request)
    SET r.data = [toFloat(requests.column1), toFloat(requests.column2)]
    

    请注意,我存储了一个浮点数组作为属性。 这是由于 GDS 库中 kNN 算法的工作方式。 接下来,建议使用 Graph Data Science 库,特别是 kNearestNeighbor algorithm。 首先,您必须投影内存中的图表。

    CALL gds.graph.create('requests', 'Request', '*', {nodeProperties: ['data']})
    

    然后运行knn算法,或许是把结果写回数据库:

    CALL gds.beta.knn.write('requests', {
      nodeWeightProperty: 'data',
      writeRelationshipType: 'SIMILAR',
      writeProperty: 'score',
      topK: 10
    })
    

    使用 kNN 算法,您无法定义相似度阈值,只能定义前 K 个邻居。但是,您可以使用纯余弦相似度算法来定义相似度阈值。

    MATCH (r:Request)
    WITH {item:id(r), weights: r.data} AS userData
    WITH collect(userData) AS data
    CALL gds.alpha.similarity.cosine.write({
      data: data,
      similarityCutoff: 0.5
    })
    

    【讨论】:

      猜你喜欢
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      • 2020-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多