2014-12-19 4 views
0

У меня есть график с двумя типами узлов: User and Activity. Пользователи могут дружить друг с другом. Я хочу получить новость от пользователя. Ниже мой запрос:Внедрение новостей в Neo4j

 MATCH (me:User) WHERE me.id = '#{opts[:user_id]}' 
     MATCH (me)-[:FRIEND*0..1]->(user)-[:CREATE_ACTIVITY]->(activity) 
     RETURN activity.id AS id, 
       activity.created_at AS created_at, 
       activity.activity_type AS activity_type, 
       { 
       id: user.id, 
       name: user.name, 
       avatar_name: user.avatar_name 
       } AS user 

     ORDER BY activity.created_at 
     LIMIT 10 

Однако этот запрос не является эффективным, так как кажется, не применять индексы и будет проверять все данные. Кроме того, после добавления индекса в Activity: created_at ничего не изменилось.

Может ли кто-нибудь предоставить эффективный метод извлечения новостей?


Update:

Я использую Ruby, драгоценный камень.

У меня есть индекс в поле идентификатора пользователя и активности, а также на created_at Activity. Я ожидал, что ORDER BY будет использовать индекс на created_at, но это не так.

+0

Каковы ваши показатели? –

+0

Я также заметил, что вы используете интерполяцию с помощью '# {}'. Вы используете рубин? Если да, используете ли вы камень neo4j или что-то еще? Ядро neo4j/neo4j-core сделает запись cypher nicer –

+1

Индексы не используются для заказа, вы можете поделиться профилем своего запроса (из консоли neo4j-shell или localhost: 7474/webadmin ->) - префикс вашего запроса с ключевым словом 'profile'. –

ответ

1

переписывания запроса, немного и с помощью Титулы:

MATCH (me:User)-[:FRIEND*0..1]->(user) 
WHERE me.id = {user_id} 
WITH user LIMIT 1000 
MATCH user-[:CREATE_ACTIVITY]->(activity) 
RETURN activity.id AS id, 
     activity.created_at AS created_at, 
     activity.activity_type AS activity_type, 
     { 
      id: user.id, 
      name: user.name, 
      avatar_name: user.avatar_name 
     } AS user 

ORDER BY activity.created_at 
LIMIT 10 

Params может помочь ускорить процесс, но я сомневаюсь, что это проблема. Сколько друзей у пользователя есть? Есть ли индекс в свойстве id? Как насчет created_at? Также обратите внимание, что WHERE me.id = НЕ совпадает с WHERE ID(me) =. Первые проверяет id собственности, второй проверяет внутренний нео ID

+0

Привет! Посмотрите мое обновление :) У пользователя может быть не более 1000 друзей. – HanXu

+0

Я думаю, что сделаю это –

0

убедитесь, что у вас есть индексы вы говорите о (т.е. они появляются в профиле),

вы можете попытаться изменить запрос:

MATCH (me:User) WHERE me.id = '#{opts[:user_id]}' 
    MATCH (me)-[:FRIEND*0..1]->(user) 
    WITh distinct user 
    MATCH (user)-[:CREATE_ACTIVITY]->(activity) 
    RETURN activity.id AS id, 
      activity.created_at AS created_at, 
      activity.activity_type AS activity_type, 
      { 
      id: user.id, 
      name: user.name, 
      avatar_name: user.avatar_name 
      } AS user 

    ORDER BY activity.created_at 
    LIMIT 10 
Смежные вопросы