neo4j在寻找路径时查询性能低下

时间:2015-06-23 16:33:49

标签: neo4j cypher

我有以下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

1 个答案:

答案 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)