2015-02-18 3 views
0

Я на 99% в полном объеме с моим запросом, но просто должен его оптимизировать сейчас. В запросе ниже число Media имеет отношение WITH для тега targetиtag - это расчет дважды. Однажды в первом матче, когда я делаю count(r) и, во-вторых, WHERE media-[:WITH]->(target) WITH COUNT(*). Я хотел бы оптимизировать запрос, чтобы передать счеты с первого совпадения и сопоставить его с каждым тегом, чтобы мне не приходилось вычислять это значение дважды. Как я могу передать 2 коллекции и раскрутить их? Или, если есть какой-либо другой способ сэкономить на этом дублирующем расчете, я бы с удовольствием это услышал.Как я могу разматывать несколько соединений?

Пример консоли: http://console.neo4j.org/?id=26vqyk

MATCH (target:Tag {name:'tagName'})<-[:WITH]-(:Media)-[r:WITH]->(tag:Tag) 
WITH count(r) as counts, tag, target 
ORDER BY counts DESC LIMIT 100 
WITH collect(tag) as tags, target 
UNWIND tags as tag 
MATCH (m:Media)-[r:WITH]->(tag) 
WITH count(r) as totes, collect(m) as medias, target, tag.name as tag 
UNWIND medias as media 
MATCH media 
WHERE media-[:WITH]->(target) 
WITH COUNT(*) as both, totes, tag 
RETURN tag, both, totes, both/(totes*1.0)*100 
ORDER BY both DESC LIMIT 100 

ответ

1

Почему вы собираете теги, а затем расслабиться сразу после? Esp. как вы никогда не используете теги снова?

Некоторые идеи:

MATCH (target:Tag {name:'tagName'})<-[r1:WITH]-(:Media)-[r2:WITH]->(tag:Tag) 
WITH count(distinct r2) as tagCounts, count(distinct r1) as mediaCounts, tag, target 
ORDER BY mediaCounts DESC LIMIT 100 
MATCH (m:Media)-[r:WITH]->(tag) 
WITH count(r) as totes, size((m)-[:WITH]->(target)) as both, 
    target, tag.name as tag, mediaCounts, tagCounts 
.... 
+0

разматываю потому что я должен выполнить запрос по каждому из тегов, и единственный способ сделать это, чтобы сначала собрать, а затем расслабиться. Что возвращает mediaCounts в ваш запрос? count (r1) & count (r2) - одинаковое число. – Zaheer

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