Cypher查询以计算Jaccard相似性



我正在从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;

有没有人知道为什么它没有完成?它是否正确?预先感谢您的任何帮助。

您的查询将缓慢执行,因为它创建了期刊的笛卡尔产品,这意味着对于n期刊,它将在查询期间处理n^2行。

Graph Analytics是一种用例,不适合Cypher。您可以用Cypher表达相似性/中心度指标,但对于大图,它们的速度会很慢。如果您的主要目标是执行图形分析,则应避免使用Cypher并使用专用的全局图处理技术,例如Spark(可以使用Mazerunner库从Neo4J读取),Flink或Giraph。Cypher是一种很好的表现力语言,但其主要用例是模式匹配,而不是全局图分析。

您可以使用更有效的技术(例如,更适合图形分析并使用多个CPU核心),但计算Jaccard索引将始终需要n^2步。因此,您可能还需要使用另一个相似性指标或更快的评估近似值。

最新更新