我从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;
有谁知道它为什么没有完成?它是否正确? 提前感谢您的帮助。
答案 0 :(得分:2)
您的查询将执行缓慢,因为它会创建日记的笛卡尔积,这意味着对于n个日记帐,它将在查询期间处理n ^ 2行。
图形分析是一个不适合Cypher的用例。您可以使用Cypher表达相似性/中心性指标,但对于大型图表来说它们会很慢。如果您的主要目标是执行图形分析,则应避免使用Cypher并使用专用的全局图形处理技术,例如Spark(可以使用Mazerunner库从Neo4j读取),Flink或{{3 }}。 Cypher是一种优秀且富有表现力的语言,但它的主要用例是模式匹配,而不是全局图分析。
虽然您可以使用更高效的技术(例如,更适合图形分析并使用多个CPU核心),但计算Jaccard索引始终需要n ^ 2步。因此,您可能还想使用更快评估的其他相似性度量或近似值。