neo4j笛卡尔产品性能改进

neo4j笛卡尔产品性能改进,neo4j,query-optimization,cypher,cartesian-product,Neo4j,Query Optimization,Cypher,Cartesian Product,我有一个超过200万个节点的图形数据库。我有一个应用程序,它获取一个社交图并对其进行一些推断。作为算法的一步,我必须获得两个连接节点的关系[:friends]的所有可能组合。目前,我有一个查询,如下所示: 匹配(a)-[:friend](c),(b)-[:friend](d)其中id(a)={ida}和id(b)={idb}返回不同的c作为第一个,d作为第二个 因此,我已经知道了节点a和b,我想从a和b的朋友那里得到所有可能的配对。 这显然是一个非常缓慢的操作。我想知道在neo4j中是否有更有效

我有一个超过200万个节点的图形数据库。我有一个应用程序,它获取一个社交图并对其进行一些推断。作为算法的一步,我必须获得两个连接节点的关系[:friends]的所有可能组合。目前,我有一个查询,如下所示: 匹配(a)-[:friend](c),(b)-[:friend](d)其中id(a)={ida}和id(b)={idb}返回不同的c作为第一个,d作为第二个

因此,我已经知道了节点
a
b
,我想从
a
b
的朋友那里得到所有可能的配对。 这显然是一个非常缓慢的操作。我想知道在neo4j中是否有更有效的方法获得相同的结果。也许添加索引会有所帮助?欢迎提供任何想法/线索

示例 节点
a
有朋友:
x
y
节点
b
有朋友:
g
h
i``
那么结果应该是:
x
g

x
h

x
i

y
g

y
h
y
i`

如果你还没有,你应该使用标签来加速你的查询,它可能看起来像:

MATCH (p1:Person)-[:FRIEND]->(p3:Person),(p2:Person)-[:FRIEND]->(p4:Person)
WHERE ID(p1) = 6 AND ID(p2) = 7
RETURN p3 as first, p4 as second
显然,这将取决于您是否使用
:Person
标签创建了节点


平均节点有多少个朋友?

我不会使用两种模式,而只使用一种模式和
中的
操作符

MATCH (p:Person)-[:FRIEND]->(friend:Person) 
WHERE id(p) IN [1,2,3]
RETURN p, collect(friend) as friends

那么你就没有交叉产品了,你也可以很好地将朋友们作为每人的收藏品返还。

谢谢你的回复。你能解释一下为什么这会有帮助吗?我不知道朋友的平均数量,但差别很大。从极少数(少于10)到数百甚至数千。