Оптимизация запроса Cypher для производительности - Социальный график - PullRequest
0 голосов
/ 25 июня 2019

У меня есть запрос Cypher, который мы используем для получения пользовательских каналов в реальном времени. У пользователей есть друзья, а пользователи следят за другими. Запрос возвращает правильные результаты, но для возврата результатов требуется относительно много времени (11395 мс).

Я создал индексы для следующих свойств узлов Пользователь (userId, IsActive, FeaturedUser) Поток (AccessScope)

Я также пытался выяснить, можем ли мы создать индексы для отношений, но безуспешно.

План выполнения запроса

  MATCH (u:User { SpFeaturedUser: true })<-[:CREATED_BY]-(fe)-[:FEED_TYPE]->(:ServiceType{Id: 13})
                                WITH fe
                                ORDER BY fe.UpdatedUTCDateTime DESC
                                SKIP 0
                                LIMIT 100
                                OPTIONAL MATCH (fe)-[:CREATED_BY]->(u:User)
                                OPTIONAL MATCH (fe)-[:FEED_TYPE]->(st:ServiceType)
                                OPTIONAL MATCH (fe)-[endrs:ENDORSED]->(p:Place)
                                OPTIONAL MATCH (p:Place)-[placeImage:RELATED_IMAGE]->(pImg:Image)
                                OPTIONAL MATCH(fe)< -[likes: LIKES] - ()
                                OPTIONAL MATCH(fe)< -[cmts: COMMENT_ON_FEED] - (c)
                                OPTIONAL MATCH (m:Mentions)-[:MENTIONED_IN]->(fe)
                                OPTIONAL MATCH (fe)-[:RELATED_IMAGE]->(img:Image)
                                OPTIONAL MATCH (fe)-[:RELATED_SERVICE_URL]->(su)
                                WITH {
                                    Description: fe.Description,
                                    DescriptionEncoded: fe.DescriptionEncoded,
                                    EndorsementType: fe.PostType,
                                    CreatedUTCDateTime: fe.CreatedDateTime,
                                    UpdatedUTCDateTime: fe.UpdatedDateTime,
                                    StartDate: fe.StartDate,
                                    EndDate: fe.EndDate,
                                    AccessScope: fe.AccessScope,
                                    Rating: fe.Rating,
                                    EndorsementId: fe.ServiceId,
                                    ServiceTypeId: st.Id,
                                    LikeCount: Count(distinct(likes)),
                                    IsLiked: EXISTS((fe) < -[:LIKES] - (: User{ UserId: "4F97D90E-922C-4C44-8F68-8311C60D76D9"}) ),
                                    CommentsCount: Count(distinct(cmts)),
                                    LastActivity: { 
                                        en: fe.Activity, 
                                        da: fe.DanishActivity
                                        },
                                    User: {
                                        UserId: u.UserId,
                                        FirstName: u.FirstName,
                                        FileName: u.FileName,
                                        SocialMediaAttribution: {

                                        }
                                    },
                                    Endorsement_Mentions: CASE WHEN m IS NOT NULL THEN Collect(distinct {
                                        Name: m.Name,
                                        Type: m.TagType,
                                        PlaceHolder: m.Placeholder,
                                        TagID: m.TagId
                                    }) ELSE [] END ,
                                    Endorsement_Image: CASE WHEN img IS NOT NULL THEN Collect(distinct {
                                        ImageUrl: img.ImageUrl,
                                        Width: img.Width,
                                        Height: img.Height,
                                        Extension: img.Extension,
                                        CreatedUTCDateTime: img.CreatedUTCDateTime
                                    }) ELSE [] END,
                                    URLPreviews: CASE WHEN su IS NOT NULL THEN Collect(distinct {
                                      Title           : su.UrlTitle         ,
                                      Description     : su.UrlDescription   ,
                                      ImageURL        : su.PreviewImage      ,
                                      URL             : su.Url           ,
                                      Width           : su.Width         ,
                                      Height          : su.Height        ,
                                      Extension       : su.Extension     ,
                                      IsVideoUrl      : su.IsVideoUrl    ,
                                      VideoStreamUrl  : su.VideoStreamUrl,
                                      VideoType       : su.VideoType       
                                    }) ELSE [] END,
                                    Object: {
                                        ObjectId: p.ObjectId,
                                        Name: p.ObjectName,
                                        IsFollowed: EXISTS((fe)-[:ENDORSED]->()<-[:FOLLOW]-({UserId : "4F97D90E-922C-4C44-8F68-8311C60D76D9"})),
                                        AverageRating: {
                                            Count: p.ObjectAvgRating
                                        },
                                        EndorsementCount: Count(distinct(endrs)),
                                        Object_Image: CASE WHEN pImg IS NOT NULL THEN
                                              Collect(distinct {
                                                ImageUrl: pImg.ImageUrl,
                                                Width: pImg.Width,
                                                Height: pImg.Height,
                                                Extension: pImg.Extension,
                                                CreatedUTCDateTime: pImg.CreatedUTCDateTime
                                              }) ELSE [] END,
                                        Category: {
                                            CategoryId: p.CategoryId 
                                        },
                                        Country: {
                                            ShowBarometer: false
                                        }
                                    }
                                } as Feed 
            RETURN DISTINCT(Feed)
            ORDER BY Feed.UpdatedUTCDateTime DESC

Ожидаемый результат состоит в том, что этот запрос должен выполняться достаточно быстро, чтобы возвращать результаты в течение 2-3 секунд, поскольку другие запросы уже выполняются.

1 Ответ

0 голосов
/ 26 июня 2019

Поскольку вашему запросу не нужны какие-либо результаты из предложений OPTIONAL MATCH, их удаление должно ускорить запрос и избежать потенциальных дублирующих результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...