2017-06-20 499 views
0

我有一个关于如何根据关系属性高效地过滤搜索结果的问题。Neo4j Cypher在大型图上按权重过滤关系


我有这样的曲线图:

(:PERSON) - [:WORKED_WITH {重量:30}] - >(:PERSON)

超过300.000节点标记的PERSON和过15.000.000条边标记为:WORKED_WITH(每条都有一个整数权重)。


现在,例如,我想拥有它们之间权重最高的10个节点组合。所以我的查询看起来像这样:

MATCH (n:PERSON)-[r:WORKED_WITH]->(m:PERSON) 
RETURN n.name, m.name, r.weight 
ORDER BY r.weight DESC 
LIMIT 10; 

正如我最近读到它是不可能对一个关系的属性创建索引。我读过你可以创建像< 50,50-100,> 100这样的分区的节点作为例子,但是这并不像最佳实践......有没有可能使用类似于(不等式)索引的东西?或者,你认为解决这类问题有效吗?

问候 沃尔夫冈

回答

0

斯特凡Armbruster的解释点(和你的选择)以及在How to create an index on a property of a relation。 (如果没有其他方法可以减少初始搜索)......那么您可能需要对其进行重新编码(作为节点)。这可能确实不“感觉”正确,但这是最佳实践。

希望这有助于 汤姆

+0

非常感谢您的回答,我已经读过那个帖子,但没想到却正好击中我的问题...... –

+0

问题是你的入口点到图形。如果我很好地理解你的解释(如果不是,请纠正我),唯一的决定因素是关系上的财产。如果是这样,你的选择是有限的(如果你想要的东西是快速的)。 –

+0

我不想改变每个新任务的数据模型......我想到了一些像Neo4j基于这个属性强制内部排序的东西......所以我可以轻松地说rel.weight> 50或者介于30和30之间50 ....我会在以后使用一个jaccard系数,这将更难以分裂... –