neo4j cypher检索路径节点

时间:2015-06-16 07:50:17

标签: neo4j cypher

我有以下示例数据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条红线) enter image description here

2。第二个问题

目前我在每个Hit对象中都包含了页面,这是导致腰部资源的原因。我想接收最终结果,页面中与Hit相​​关的页面名称。 (在真实数据库中,每个Hit有大约10个相关节点,我需要在结果对象中返回5个,所以不要认为它可以包含在第一个MATCH中吗?)

1 个答案:

答案 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.*)'

其余的将是相同的