我有以下示例数据http://console.neo4j.org/?id=ktfn9n, 我有两个问题:
1.关于以下查询:(尝试查找特定网页的Hits路径中的所有子路径)
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
你可以在控制台的结果集中看到:结果是:
[{page:" home"},{page:" register"},{page:" buy"}] 1
我所期待的是:
[{page:" home"},{page:" register"},{page:" buy"}] 2
因为在该示例中有3个页面的流程有2条路径(附图中有2条红线)
2。第二个问题
目前我在每个Hit对象中都包含了页面,这是导致腰部资源的原因。我想接收最终结果,页面中与Hit相关的页面名称。 (在真实数据库中,每个Hit有大约10个相关节点,我需要在结果对象中返回5个,所以不要认为它可以包含在第一个MATCH中吗?)
答案 0 :(得分: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.*)'
其余的将是相同的