2015-06-16 2 views
1

я следующий выборочные данными, http://console.neo4j.org/?id=ktfn9n, и у меня есть 2 вопроса:Neo4j высчитывать получить свойство родственных узлов узлов РАТНЫ

1.About следующего запроса: (пытаюсь найти все суб- пути внутри Переходы пути конкретных страниц)

MATCH (step1:Hit) 
WHERE step1.page =~ '(?i)(.*home.*)' 
MATCH (step2:Hit) 
WHERE step2.page =~ '(?i)(.*register.*)' 
MATCH (step3:Hit) 
WHERE step3.page =~ '(?i)(.*buy.*)' 
MATCH path=step1-[:NEXT*]->step2-[:NEXT*]->step3 
WITH filter(n IN NODES(path) 
     WHERE n:Hit AND n.page =~ '(?i)(.*home.*|.*register.*|.*buy.*)') AS filtered 
WITH extract(v IN filtered| { page:lower(v.page)}) AS ex UNWIND ex AS pages 
WITH COLLECT(DISTINCT pages) AS hits 
RETURN hits,count(hits) AS path_users_count 
ORDER BY path_users_count DESC 

, как вы можете видеть в результате, установленных в консоли: результат:

[{страница: "дом"}, {страница: "зарегистрировать"}, {страница: "купить"}] 1

, что я ожидал, что это:

[{страница:» home "}, {page:" register "}, {page:" buy "}] 2

так как там два пути с потоком 3-х страниц в примере (2 красные линии на прикрепленном изображении) enter image description here

2. второй вопрос

В настоящее время я включаю страницу в каждый объект Hit, что вызывает талию ресурсов. Я хочу принять окончательный результат, название страницы из страницы, которая связана с Хит. (в реальной базе данных у меня есть около 10 связанных узлов для каждого Hit, и мне нужно вернуть 5 из них в объект результата, поэтому не думаю, что он может быть включен в первый MATCH вправо?)

+0

попробовать с размером (хитов) –

+0

с размером я получаю 3 вместо 2 –

ответ

1

Когда вы UNWIND, а затем collect(DISTINCT ...), вы разгадываете свой набор массивов в один плоский список, а collect вносите его в один отдельный список вместо одного для каждого соответствия пути. Если включить переменную path в ваших WITH с вы будете продолжать держать их сгруппированы по пути:

MATCH (step1:Hit) 
WHERE step1.page =~ '(?i)(.*home.*)' 
MATCH (step2:Hit) 
WHERE step2.page =~ '(?i)(.*register.*)' 
MATCH (step3:Hit) 
WHERE step3.page =~ '(?i)(.*buy.*)' 
MATCH path=step1-[:NEXT*]->step2-[:NEXT*]->step3 
WITH path, filter(n IN NODES(path) 
     WHERE n:Hit AND n.page =~ '(?i)(.*home.*|.*register.*|.*buy.*)') AS filtered 
WITH path, extract(v IN filtered| {page:lower(v.page)}) AS ex 
UNWIND ex AS pages 
WITH path, COLLECT(DISTINCT pages) AS hits 
RETURN hits,count(hits) AS path_users_count 
ORDER BY path_users_count DESC 

Это возвращает 3, хотя я думаю, что может быть правильным, потому что второй путь в нижней левой части графика содержит два пути, которые соответствуют вашим критериям.

Я не уверен, что понимаю ваш второй вопрос. Вы имеете в виду, что хотите иметь метку Page, у которой есть узлы, которые ссылаются на ваши узлы Hit, чтобы сказать, на какой странице они попали? Если это так, я не думаю, что это проблема. Я думаю, вы могли бы изменить начало для этого:

MATCH (step1:Hit)-[:HITS]->(page1:Page) 
WHERE page1.url =~ '(?i)(.*home.*)' 
MATCH (step2:Hit)-[:HITS]->(page2:Page) 
WHERE page2.url =~ '(?i)(.*register.*)' 
MATCH (step3:Hit)-[:HITS]->(page3:Page) 
WHERE page3.url =~ '(?i)(.*buy.*)' 

, а остальные будут такими же

+0

привет @ Брайан-подлеска, первый - Большое спасибо за подробный ответ! проблема - поток обращений, на самом деле это путешествие пользователя на сайт, поэтому я не могу считать такой поток дважды. (у меня все еще есть проблема, если пользователь дважды посетил страницу «домой» - любая помощь с ней была бы оценена!) со второй частью я имел в виду, что я хочу, чтобы у хита были только и id, а остальные данных будут разделены метками. на самом деле у меня есть более связанные ярлыки: страница, страна, ОС, устройство и т. д., и мне все они нужны в ответ.Еще раз спасибо –

+0

Все эксперты neo4j. Кто может помочь? –

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