我有以下Cypher查询,运行速度非常快(3秒)
MATCH (step1:Hit),(step2:Hit),(step3:Hit),(step4:Hit),
step1-[:VISITED]->(_page1:Page), step1-[:SOURCE_COUNTRY]->(_country1:Country), step1-[:USED_DEVICE]->(_device1:Device),
step2-[:VISITED]->(_page2:Page), step2-[:SOURCE_COUNTRY]->(_country2:Country), step2-[:USED_DEVICE]->(_device2:Device) ,
step3-[:VISITED]->(_page3:Page), step3-[:SOURCE_COUNTRY]->(_country3:Country), step3-[:USED_DEVICE]->(_device3:Device),
step4-[:VISITED]->(_page4:Page), step4-[:SOURCE_COUNTRY]->(_country4:Country), step4-[:USED_DEVICE]->(_device4:Device)
WHERE _page1.page_key =~ '(?i)(.*lnd\\.my-domain.com.*)' and step1.date_time>=1432296000 and NOT(()-[:NEXT*]->step1)
and _page2.page_key =~ '(?i)(.*register.*)' and step2.date_time>=1432296000
and _page3.page_key =~ '(?i)(.*customer-info.*)' and step3.date_time>=1432296000
and _page4.page_key =~ '(?i)(.*deposit.*)' and step4.date_time>=1432296000
return step1 limit 5
一旦我添加了一个路径(最后2行)变量,它就会运行5分钟:(
MATCH (step1:Hit),(step2:Hit),(step3:Hit),(step4:Hit),
step1-[:VISITED]->(_page1:Page), step1-[:SOURCE_COUNTRY]->(_country1:Country), step1-[:USED_DEVICE]->(_device1:Device),
step2-[:VISITED]->(_page2:Page), step2-[:SOURCE_COUNTRY]->(_country2:Country), step2-[:USED_DEVICE]->(_device2:Device),
step3-[:VISITED]->(_page3:Page), step3-[:SOURCE_COUNTRY]->(_country1:Country), step3-[:USED_DEVICE]->(_device3:Device),
step4-[:VISITED]->(_page4:Page), step4-[:SOURCE_COUNTRY]->(_country4:Country), step4-[:USED_DEVICE]->(_device4:Device)
WHERE _page1.page_key =~ '(?i)(.*lnd\\.my-domain.com.*)' and step1.date_time>=1432296000 and NOT(()-[:NEXT*]->step1)
and _page2.page_key =~ '(?i)(.*register.*)' and step2.date_time>=1432296000
and _page3.page_key =~ '(?i)(.*customer-info.*)' and step3.date_time>=1432296000
and _page4.page_key =~ '(?i)(.*deposit.*)' and step4.date_time>=1432296000
MATCH path=step1-[:NEXT*..2]->step2-[:NEXT*..2]->step3-[:NEXT*..2]->step4
return path limit 5
图表的(伪)结构为:
(用户)有多个(Session {session_id})
(会话)有1个或更多(Hit {date_time,hit_id})
(Hit)与以下所有内容都有一个关系:
(浏览器),(国家),(设备),(Page {page_key})
每个Hit也有一个(0或更多)关系:[NEXT]到同一个会话中的下一个Hit
答案 0 :(得分:1)
您遇到的问题不是路径搜索,而是查找起始节点和结束节点的方式。
另一件事是你在查询开始时创建了一个巨大的基数爆炸。
尝试在Neo4j浏览器中执行查询的“PROFILE”执行,然后您会看到一大堆时间用于扫描所有数据。
你也没有使用国家和设备?不确定你需要它们吗?
我建议现在使用精确查找页面搜索,并且只有在查询真的很快之后,才能查看全文搜索。
准确的查找是查找包含INDEX ON :Page(page_key)
并执行page.page_key = {url}
或page.page_key IN {urls}
要进行有效的全文搜索,现在您必须使用manual index。
但是很快就会使用Neo4j 2.3,你将可以使用支持索引的LIKE
。
类似于时间戳范围,您也可以使用time-tree。
根据两个选择标准中哪一个更具选择性,我会研究其中任何一个。
您的所有路径也已断开连接,您应该尝试逐步连接它们。现在他们根本没有相关的关系。
此NOT(()-[:NEXT*]->step1)
应为NOT(()-[:NEXT]->step1)