我似乎无法将查询时间缩短

时间:2018-06-08 20:11:15

标签: neo4j cypher neo4jclient

我已经在google上搜索了一下,想知道去哪里询问查询分析,但是一切都让我回到了这里。如果我错了,我会道歉,这应该去其他地方。

以下是我的数据库的当前统计信息(运行Neo4j服务器v3.4):

Database Info

我的Neo4jClient查询:

var query = graphClient
                 .Cypher
                 .Match("(cp:CurrencyPair) - [:Currency_Pair] -> (mkt:MarketInfo)")
                 .With("mkt, cp")
                 .Where((CurrencyPair cp) => cp.Name == Pair.Name)
                 .AndWhere((MarketInfo mkt) => mkt.StartTicksUTC >= startTicks)
                 .AndWhere((MarketInfo mkt) => mkt.EndTicksUTC <= endTicks)
                 .With("mkt, cp")
                 .OrderBy("mkt.EndTicksUTC DESC")
                         .Match("(mkt) -[Ask_Input_Data] - (a:Ask)")
                         .With("mkt, cp, a")
                         .Match("(mkt) -[Bid_Input_Data] - (b:Bid)")
                         .With("mkt, cp, a, b")
                         .Return((mkt, cp, a, b) => new
                         {
                             MarketInfo = mkt.As<MarketInfo>(),
                             CurrencyPair = cp.As<CurrencyPair>(),
                             Ask = a.As<Ask>(),
                             Bid = b.As<Bid>()
                         });

产生的Neo4j查询:

profile 
MATCH (cp:CurrencyPair) - [Currency_Pair] -> (mkt:MarketInfo) 
WITH mkt, cp 
WHERE (cp.Name = "AUD/CAD") AND (mkt.StartUTC >= "2012-01-10T15:50:00+00:00" ) AND (mkt.StartUTC <= "2012-01-10T16:00:00+00:00" ) 
WITH mkt, cp 
ORDER BY mkt.EndTicksUTC DESC 

MATCH (mkt:MarketInfo) <-[Ask_Input_Data] - (a:Ask) 
WITH mkt, cp, a 
MATCH (mkt:MarketInfo) <-[Bid_Input_Data] - (b:Bid) 
WITH mkt, cp, a, b 

RETURN mkt AS MarketInfo, cp AS CurrencyPair, a AS Ask, b AS Bid

正如您所看到的,我正在尝试查询数据库以找到所有&#34; MarketInfo&#34;与给定货币节点相关的节点,然后返回仅在两个日期之间的节点。

运行此查询,需要7秒才能运行:

Query Breakdown

并返回10个节点,15个关系

enter image description here

我的数据库中有索引:

索引

   ON :NewsEvent(Date) ONLINE

   ON :MarketInfo(EndTicksUTC) ONLINE

   ON :MarketInfo(EndUTC) ONLINE

   ON :MarketInfo(EndUTCTicks) ONLINE

   ON :NewsEvent(EventID) ONLINE 

   ON :Ask(Id) ONLINE 

   ON :Component(Id) ONLINE 

   ON :NewsEvent(Id) ONLINE 

   ON :MarketInfo(Id) ONLINE 

   ON :Bid(Id) ONLINE 

   ON :NewsEvent(Id, Date) ONLINE 

   ON :MarketInfo(Interval) ONLINE 

   ON :MarketInfo(Name) ONLINE 

   ON :MarketInfo(StartTicksUTC) ONLINE

   ON :MarketInfo(StartUTC) ONLINE 

   ON :MarketInfo(StartUTCTicks) ONLINE 

有关如何加快查询速度的任何想法?也许我只是在犯这个错误?在Neo4j上出售我的老板变得越来越难,而不是使用&#34;尝试过的真实&#34; MS SQL Server ...

1 个答案:

答案 0 :(得分:2)

你犯了几个重大错误。

  1. 您使用多余的WHERE子句将MATCH子句与第一个WITH子句分开。这导致WHERE子句根本不过滤MATCH子句 - 因此它找到了(cp:CurrencyPair) - [:Currency_Pair] -> (mkt:MarketInfo)模式的所有实例。
  2. 您的关系类型根本没有指定,因为您的名字前面没有冒号。因此,模式中指定的节点之间的所有关系都已匹配。
  3. 您在:CurrencyPair(Name)上错过了一个索引。 (你真的需要其他每一个索引吗?它们会在创建/删除相关节点时引入开销。)
  4. 以下是您的查询的固定版本应该运行得更快(特别是在您添加:CurrencyPair(Name)的索引之后):

        MATCH (cp:CurrencyPair) - [:Currency_Pair] -> (mkt:MarketInfo) 
        WHERE cp.Name = "AUD/CAD" AND
          "2012-01-10T15:50:00+00:00" <= mkt.StartUTC <= "2012-01-10T16:00:00+00:00"
        MATCH (mkt) <-[:Ask_Input_Data] - (a:Ask)
        MATCH (mkt) <-[:Bid_Input_Data] - (b:Bid)     
        RETURN mkt AS MarketInfo, cp AS CurrencyPair, a AS Ask, b AS Bid
        ORDER BY MarketInfo.EndTicksUTC DESC