Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
neo4j比较关系时查询速度慢_Neo4j_Cypher - Fatal编程技术网

neo4j比较关系时查询速度慢

neo4j比较关系时查询速度慢,neo4j,cypher,Neo4j,Cypher,我正在构建一个小的变更跟踪应用程序。我想在此过程中学习图形数据库。我制作了一个模型,其中我有一个带有多个运行检查项目的changetracker。在运行A中,我找到了1,2,3,4,5,在下一次运行中,我可能会找到1,2,4,5,6 所以我做了一个简单的模型 (:ChangeTracker)-[:Has_Run]->(:Run) (:Run)-[:NEXT]->(:Run) (:Run)-[:HAS_Found]->(:Item) 在进行基准测试时,以下查询的速度非常慢(50

我正在构建一个小的变更跟踪应用程序。我想在此过程中学习图形数据库。我制作了一个模型,其中我有一个带有多个运行检查项目的changetracker。在运行A中,我找到了1,2,3,4,5,在下一次运行中,我可能会找到1,2,4,5,6

所以我做了一个简单的模型

(:ChangeTracker)-[:Has_Run]->(:Run)
(:Run)-[:NEXT]->(:Run)
(:Run)-[:HAS_Found]->(:Item)
在进行基准测试时,以下查询的速度非常慢(50000项会导致查询时间>10秒)

PROFILE
匹配
(t:WebsiteTracker{Id:'fde6fd1f-a899-5295-b73b-63fa75d131f4'})-[:HAS_SiteMapRun]->(lastRun)()
带着t跑
匹配
(运行)-[:下一步]->(运行下一步),
(runNext)-[:HAS_Found]->(itm)
哪里
未(运行)-[:已找到]->(itm)
返回
t、 Id、t.名称、运行、itm
订购人
下一步,开始
我想罪魁祸首是
NOT(runPrev)-[:HAS_Found]->(itm)
,但是我如何才能使我的查询更好

正如预期的那样,
NOT(runPrev)-[:HAS\u Found]->(itm)
部分正在命中每个项目节点,但是结果看起来还不错

如果有,可以使用apoc.coll.pairsMin()获取每次运行的相邻对,并对项目集合使用apoc.coll.subtract()查找上一次运行中不存在的新元素

这需要Neo4j 3.1,因为我们使用模式理解来获得每次运行的项目列表

大概是这样的:

MATCH
  (t:ChangeTracker)-[:HAS_Run]->(run)
WHERE
  t.Id = 'fde6fd1f-a899-5295-b73b-63fa75d131f4'
  AND NOT (run)-[:NEXT]->()
MATCH 
  (runPrev)-[:NEXT*0..7]->(run)
WITH t, runPrev
ORDER BY runPrev.Start
WITH t, COLLECT({run:runPrev, 
  items:[(runPrev)-[:HAS_FOUND]->(itm) | itm]}) as runs
WITH t, apoc.coll.pairsMin(runs) as runPairs
UNWIND runPairs as runPair
WITH HEAD(runPair) as runPrev, LAST(runPair) as runNext
WITH t, runPrev, runNext, 
  apoc.coll.subtract(runNext.items, runPrev.items) as newItems
RETURN t.Id, t.Name, runNext.run as run, newItems
ORDER BY
  run.Start

谢谢,今天晚些时候我会试试的不走运。。。。收集找到的项比使用第一个查询慢。我猜信息没有太大变化,因此我将向HAS\u Found关系添加额外的属性。并使用cron作业定期检查未检查的HAS_发现的关系。检查每一个HAS_find,如果是新的查找、旧的查找或临时的最后一个查找,则添加属性。啊,不幸的是,我不确定执行集合减法是否会击败模式匹配,看起来这种方法已经过时了。能否将查询的扩展配置文件添加到描述中?有时这会给一些需要优化的地方带来一些线索。我放弃了neo4j而选择了dgraph.io。密集图的速度要快得多。我从来没有想过如何提高性能。在某个时刻,我甚至无法再提交事务。尽管如此,这还是指向某个方向的唯一指针,所以我接受这个答案作为答案。
MATCH
  (t:ChangeTracker)-[:HAS_Run]->(run)
WHERE
  t.Id = 'fde6fd1f-a899-5295-b73b-63fa75d131f4'
  AND NOT (run)-[:NEXT]->()
MATCH 
  (runPrev)-[:NEXT*0..7]->(run)
WITH t, runPrev
ORDER BY runPrev.Start
WITH t, COLLECT({run:runPrev, 
  items:[(runPrev)-[:HAS_FOUND]->(itm) | itm]}) as runs
WITH t, apoc.coll.pairsMin(runs) as runPairs
UNWIND runPairs as runPair
WITH HEAD(runPair) as runPrev, LAST(runPair) as runNext
WITH t, runPrev, runNext, 
  apoc.coll.subtract(runNext.items, runPrev.items) as newItems
RETURN t.Id, t.Name, runNext.run as run, newItems
ORDER BY
  run.Start