【问题标题】:Optimize a query which computes Jackard similarity between two nodes from huge data sets优化从庞大数据集中计算两个节点之间的 Jackard 相似度的查询
【发布时间】:2015-03-31 18:34:49
【问题描述】:

我有数十亿个标记为 Profile (:Profile {member_id, name, gender}) 的节点,我需要从中计算它们之间的 Jaccard 索引并创建相似关系并将索引分配为属性。 男性配置文件节点与女性配置文件节点之间存在联系关系,反之亦然。

以下是 CQL:

索引性别。

MATCH (u1:Profile {gender:"Male"}), (u2:Profile {gender:"Male"}) WHERE u1 <> u2
MATCH (u1)-[:CONTACTED]->(u3:Profile {gender:"Female"})<-[:CONTACTED]-(u2) WITH u1, u2, count(u3.member) as intersect
MATCH (u1)-[:CONTACTED]->(u1_f:Profile {gender:"Female"}) WITH u1, u2, intersect, collect(DISTINCT u1_f.member) AS coll1
MATCH (u2)-[:CONTACTED]->(u2_f:Profile {gender:"Female"}) WITH u1, u2, collect(DISTINCT u2_f.member) AS coll2, coll1, intersect
WITH u1, u2, intersect, coll1, coll2, length(coll1 + filter(x IN coll2 WHERE NOT x IN coll1)) as union
Where (1.0*intersect/union) > 0
CREATE Unique (u1)-[:SIMILARITY {score: (1.0*intersect/union)}]-(u2);

如果我以 5 的限制执行此操作,则需要大约 5 分钟才能产生根本不可行的结果。 我可以做些什么来加快执行时间,因为这是我项目的重要组成部分?

我认为像下面这样的东西会起作用,但它使情况变得更糟。

在成员上创建了一个约束。

LOAD CSV WITH HEADERS FROM "file:{path_to_csv}/member_to_member.csv" AS row
MATCH (u1:Profile {member: row.sentby}), (u2:Profile {gender:"Male"}) WHERE u1 <> u2 AND row.status = "Contacted" AND row.sentbygender = "Male"
MATCH (u1)-[:CONTACTED]->(u3:Profile {member: row.recdby})<-[:CONTACTED]-(u2) WITH row, u1, u2, count(u3.member) as intersect
//WHERE intersect>0
MATCH (u1)-[:CONTACTED]->(u1_f:Profile {member: row.recdby}) WITH row, u1, u2, intersect, collect(DISTINCT u1_f.member) AS coll1
MATCH (u2)-[:CONTACTED]->(u2_f:Profile {member: row.recdby}) WITH row, u1, u2, collect(DISTINCT u2_f.member) AS coll2, coll1, intersect
WITH u1, u2, intersect, coll1, coll2, length(coll1 + filter(x IN coll2 WHERE NOT x IN coll1)) as union
return u1.member, u2.member, (1.0*intersect/union) as score limit 5;

member_to_member.csv

sentby,sentbygender,recdby,recdbygender,date_of_contact,status
OSH34878034,Male,angella,Female,2013-11-12,Contacted
OSH34878034,Male,AnshuSharma,Female,2013-11-12,Contacted
OSH34878034,Male,GSH26933499,Female,2013-11-12,Contacted
OSH34878034,Male,4SH00112696,Female,2013-11-12,Contacted
OSH34878034,Male,0308heinz,Female,2013-11-12,Contacted
OSH34878034,Male,8SH93301323,Female,2013-11-12,Contacted
OSH34878034,Male,098w,Female,2013-11-12,Contacted

来源: http://www.lyonwj.com/twizzard-a-tweet-recommender-system-using-neo4j/

注意:以上查询仅查找男性 -> 男性相似度

谢谢

【问题讨论】:

  • 您使用的是哪个 Neo4j 版本?您可以在 2.2 上试用并分享配置文件结果吗?
  • 您是否在某处设置了示例数据库?
  • 我使用的是 Neo4j 企业版 2.1.7。我可以与您分享开发 CSV。

标签: neo4j cypher


【解决方案1】:

使用 Java 代替 Cypher。

您的第一行已经创建了 10 亿平方行。

我可能会为所有配置文件创建一个很大的长数组

我会将 3 个计数器折叠成一个长(位掩码)

然后查看女性的所有 CONTACTED 关系(我也会将性别提升为标签)

对于每个 rel,通过节点 ID 索引找到适当的端节点条目,并增加 3 个计数器之一。

这应该会给你一个包含原始数字的数组,你可以计算结果。

【讨论】:

  • 要求已更改,我不再需要计算每个配置文件之间的相似度,但我一定会尝试您的建议并尽快回复。非常感谢您的时间和精力。
【解决方案2】:

上述查询在 Neo4j 2.2.0 中表现良好。

【讨论】:

    猜你喜欢
    • 2022-01-18
    • 2017-08-22
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    • 2015-12-16
    相关资源
    最近更新 更多