2016-12-29 2 views
1

Я запускаю этот запрос из оболочки neo4j, и я не могу понять, почему он не заканчивается. Он должен вычислить сходство Jaccard между двумя журналами, которые публикуют на них те же авторы.Cypher Quay для вычисления 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

Первой идеей является использование LIMIT (допустим, LIMIT 1) и подавление ORDER BY, чтобы увидеть, возвращает ли оно что-либо. Если это так, то возникает некоторая проблема с производительностью. Если это не так ... ясно, что в запросе есть какая-то проблема – RafaelCaballero

+0

Я добавил LIMIT 2 и подавил ORDER BY, но он не возвращает ошибок или синтаксических проблем. На самом деле, он ничего не возвращает, просто продолжает работать. Я не вижу проблемы или проблемы в моем запросе; Я запускаю его из neo4j-shell на сервере. – Valentina

+0

Насколько велика база данных - мы говорим о тысячах или миллионах узлов? –

ответ

2

Ваш запрос будет выполняться медленно, поскольку он создает декартово произведение журналов, что означает, что для n журналов он будет обрабатывать n^2 строки во время запроса.

Графическая аналитика - это прецедент, который не подходит для Cypher. Вы можете выразить показатели сходства/центрированности с помощью Cypher, но они будут медленными для больших графиков. Если ваша основная цель - выполнить графическую аналитику, вы должны избегать Cypher и использовать специальные технологии обработки глобальных графов, такие как Spark (которые могут читать из Neo4j, используя библиотеку Mazerunner), Flink или Giraph. Cypher - отличный и выразительный язык, но основным преимуществом является сопоставление шаблонов, а не глобальная аналитика графа.

В то время как вы можете использовать более эффективные технологии (например, которые лучше подходят для аналитики графа и используют несколько ядер процессора), вычисление индекса Jaccard всегда потребует n^2 шага. Таким образом, вы также можете использовать другие показатели сходства или приближения, которые быстрее оцениваются.

Смежные вопросы