数组上的 Neo4j 向量运算

Neo4j vector operations on arrays

我有一个图形数据库,其中每个 Sentence 节点都有一个 embeddings 属性,这是一个长度为 768 的数组。我想做的是创建一个 属性 在这些节点中的每一个中,它是所有相邻节点的平均值的聚合 embeddings.

基本上,

for each node in the graph:
    sum = [0] * 768
    count = 0
    for neighbour in node.neighbours:
        sum = vector_sum(sum, neighbour.embeddings)
        count += 1
    avg = sum / count
    node.neighbours_average = avg

目前,我正在使用 neomodel 读取节点,在 python 中执行此操作,然后将其提取到图中。可以理解,它很慢。

最有效的方法是什么?

我看过 Data Science Library、APOC 等,但是 none 其中有矢量运算。

我能够通过以下查询做到这一点:

注意:embedding是一个浮点数组

match (s:Sentence)-[r:RELATED]-(t:Sentence)
with s as sentence, collect(t.embedding) as neighbours_embeddings
set sentence.neighbour_avg = [
  w in reduce(
    s=[], neighbour_embedding IN neighbours_embeddings | 
    case when size(s) = 0 then neighbour_embedding
    else [
      i in range(0, size(s)-1) |
      s[i] + neighbour_embedding[i]
    ] end) |
    w / tofloat(size(neighbours_embeddings))
]