neo4j笛卡尔产品性能改进
我有一个超过200万个节点的图形数据库。我有一个应用程序,它获取一个社交图并对其进行一些推断。作为算法的一步,我必须获得两个连接节点的关系[:friends]的所有可能组合。目前,我有一个查询,如下所示: 匹配(a)-[:friend](c),(b)-[:friend](d)其中id(a)={ida}和id(b)={idb}返回不同的c作为第一个,d作为第二个 因此,我已经知道了节点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中是否有更有效
a
和b
,我想从a
和b
的朋友那里得到所有可能的配对。
这显然是一个非常缓慢的操作。我想知道在neo4j中是否有更有效的方法获得相同的结果。也许添加索引会有所帮助?欢迎提供任何想法/线索
示例
节点a
有朋友:x
,y
节点b
有朋友:g
,h
,i``
那么结果应该是:
x,
g
x,
h
x,
i
y,
g
y,
hy
,
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)到数百甚至数千。