2014-09-24 4 views
0

У меня есть случай, когда использование я создаю новые отношения каждый раз, когда пользователь видит фотографию, как это:Neo4jclient - вставить несколько отношений в одной партии

var dateParams = new { Date = DateTime.Now.ToString() }; 

      graphClient.Cypher 
       .Match("(user:User), (photo:Photo)") 
       .Where((UserEntity user) => user.Id == userId) 
       .AndWhere((PhotoEntity photo) => photo.Id == photoId) 
       .CreateUnique("user-[:USER_SEEN_PHOTO {params}]->photo") 
       .WithParam("params", dateParams) 
       .ExecuteWithoutResults(); 

с большим количеством одновременно работающих пользователей, это будет очень и очень часто так Мне нужно быть в очереди слишком много операций записи и выполнять их одновременно. К сожалению, я havn't удалось найти хорошую информацию о том, как сделать это наиболее эффективным образом с Neo4jClient, так что все предложения будут очень ценится :)

--- UPDATE ---

Так что я попытался разные комбинации, но я до сих пор не нашел ничего, что работает. Ниже запрос дает мне «PatternException: Unbound pattern!»?

var query = graphClient.Cypher; 
      for (int i = 0; i < seenPhotosList.Count; i++) 
      { 
       query = query.CreateUnique("(user" + i + ":User {Id : {userId" + i + "} })-[:USER_SEEN_PHOTO]->(photo" + i + ":Photo {Id : {photoId" + i + "} })") 
        .WithParam("userId" + i, seenPhotosList[i].UserId) 
        .WithParam("photoId" + i, seenPhotosList[i].PhotoId); 
      } 
      query.ExecuteWithoutResults(); 

Я также попытался изменить CreateUnique для слияния и запрос выполняется без исключения, но создает новые узлы вместо подключения существующих?

var query = graphClient.Cypher; 
      for (int i = 0; i < seenPhotosList.Count; i++) 
      { 
       query = query.Merge("(user" + i + ":User {Id : {userId" + i + "} })-[:USER_SEEN_PHOTO]->(photo" + i + ":Photo {Id : {photoId" + i + "} })") 
        .WithParam("userId" + i, seenPhotosList[i].UserId) 
        .WithParam("photoId" + i, seenPhotosList[i].PhotoId); 
      } 
      query.ExecuteWithoutResults(); 

ответ

0

Я не верю, что Neo4j/cypher имеет встроенный способ выполнить то, о чем вы просите. То, что вы можете сделать, это создать что-то, что сделает это для вас с системой очередей. Вот blog post о выполнении масштабируемых операций записи в Ruby, которые вы можете реализовать на своем языке, чтобы обрабатывать пакетные вставки/обновления.

+0

Спасибо за ваши предложения Николас! Я видел это сообщение в блоге раньше, но я действительно хочу сохранить его простым и придерживаться Neo4jClient. Я пытаюсь найти какой-то запрос foreach, который работает, но я еще не прошел :( –

1

Я установил 5 типов отношений, используя Batch Insert. Он работает очень быстро, но не уверен, как вы будете управлять interupt в многопользовательской среде. Вы должны знать nodeIDs заранее, а затем создать строку для запроса API, который выглядит, как это ...

[{"method":"POST","to":"/node/222/relationships","id":222,"body":{"to":"26045","type":"mother"}}, 
{"method":"POST","to":"/node/291/relationships","id":291,"body":{"to":"26046","type":"mother"}}, 
{"method":"POST","to":"/node/389/relationships","id":389,"body":{"to":"26047","type":"mother"}}, 
{"method":"POST","to":"/node/1031/relationships","id":1031,"body":{"to":"1030","type":"wife"}}, 
{"method":"POST","to":"/node/1030/relationships","id":1030,"body":{"to":"1031","type":"husband"}}, 
{"method":"POST","to":"/node/1034/relationships","id":1034,"body":{"to":"26841","type":"father"}}, 
{"method":"POST","to":"/node/34980/relationships","id":34980,"body":{"to":"26042","type":"child"}}] 

я сломал это вниз в разумных размеров итерационных запросов, чтобы избежать проблем с памятью. Но итерации выполняются очень быстро для настройки необходимых строк. Получение nodeID также требовало итераций, потому что Neo4j ограничивает количество узлов, возвращаемых на 1000. Это недостаток Neo4j, который был разработан на основе проблем с визуализацией (кто может изучить изображение с 10000 узлами?), А не проблемы с кодированием, такие как те, которые мы обсуждаем ,

Смежные вопросы