数组上的 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))
]
我有一个图形数据库,其中每个 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))
]