Cypher查询计算Jaccard相似度

时间:2016-12-29 13:15:19

标签: neo4j cypher

我从neo4j-shell运行此查询,我无法理解为什么它没有完成。它应该计算两个期刊之间的Jaccard相似性,这两个期刊有相同的作者在其上发表。

查询如下:

MATCH (j1:JOURNAL), (j2:JOURNAL)
WHERE id(j1) > id(j2)
WITH j1, j2
OPTIONAL MATCH common=(j1)<-[:PUBLISHED_ON]-(art1:ARTICLE)
<-[:WRITES]-(a:AUTHOR)-[:WRITES]->(art2:ARTICLE)-[:PUBLISHED_ON]->(j2)
WITH j1, j2,  COUNT(common) as intersection
OPTIONAL MATCH (j1)<-[:PUBLISHED_ON]-(art1:ARTICLE)<-[:WRITES]-(a:AUTHOR)
WITH j1, j2, intersection, COLLECT(DISTINCT a.id_author) AS t1s
OPTIONAL MATCH (j2)<-[:PUBLISHED_ON]-(art2:ARTICLE)<-[:WRITES]-(a:AUTHOR)
WHERE NOT a IN t1s
WITH j1, j2, intersection, t1s + COLLECT(DISTINCT a.id_author) AS union

RETURN j1, j2, (intersection*1.0) / size(union)*100 as js

ORDER BY js desc;

有谁知道它为什么没有完成?它是否正确? 提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您的查询将执行缓慢,因为它会创建日记的笛卡尔积,这意味着对于n个日记帐,它将在查询期间处理n ^ 2行。

图形分析是一个不适合Cypher的用例。您可以使用Cypher表达相似性/中心性指标,但对于大型图表来说它们会很慢。如果您的主要目标是执行图形分析,则应避免使用Cypher并使用专用的全局图形处理技术,例如Spark(可以使用Mazerunner库从Neo4j读取),Flink或{{3 }}。 Cypher是一种优秀且富有表现力的语言,但它的主要用例是模式匹配,而不是全局图分析。

虽然您可以使用更高效的技术(例如,更适合图形分析并使用多个CPU核心),但计算Jaccard索引始终需要n ^ 2步。因此,您可能还想使用更快评估的其他相似性度量或近似值。