Pregunta

Tengo un conjunto de juegos de PlayStation Network y un conjunto de localizaciones de texto de juegos (título del juego, descripción del juego, etc.).Quiero relacionar cada juego con una ubicación respectiva ("en", "fr", "de", por ejemplo), pero no estoy seguro del enfoque correcto o si este es el uso correcto de la cláusula FOREACH de Cypher.Estoy usando Neo4jClient para agregar/actualizar juegos y agregar/actualizar las respectivas configuraciones regionales.Aquí está el código que tengo hasta ahora:

client.Cypher
    .ForEach("(game in {PSNGames} | MERGE (g:PSNGame {NPCOMMID : game.NPCOMMID}) SET g = game)")
    .WithParams(new
    {
        PSNGames = games.ToList()
    })
    .ExecuteWithoutResults();

client.Cypher
    .ForEach("(localized in {PSNGamesLocalized} | MERGE (l:PSNGameLocalized {NPCOMMID : localized.NPCOMMID}) SET l = localized)")
    .WithParams(new
    {
        PSNGamesLocalized = localizedGames.ToList()
    })
    .ExecuteWithoutResults();

Mi pensamiento es hacer otro ForEach llama y MERGE la relación:

MATCH (g:PSNGame) WITH COLLECT(g) AS games 
FOREACH (game IN games | MERGE game-[:LOCALE]->(l:PSNGameLocalized {NPCOMMID : game.NPCOMMID}))

Sin embargo, esto crea nuevas etiquetas, nodos y propiedades de PSNGeLocalized:

Added 93 labels, created 93 nodes, set 93 properties, created 93 relationships, returned 0 rows in 326 ms

Había estado creando manualmente cada nodo y agregando/actualizando cada relación y esto estaba resultando muy lento.Me gusta la idea de realizar transacciones masivas para acelerar la importación de datos.¿Cómo hago para agregar/actualizar relaciones mientras aprovecho FOREACH?

¿Fue útil?

Solución

Después de pensar un poco más sobre cómo resolver el problema, se me ocurrió lo siguiente:

client.Cypher
    .Match("(p:PSNProfile {PSNId : {profile}.PSNId})")
    .ForEach(@"(game in {PSNGames} | 
                MERGE p-[:PLAYS {LastPlayed : game.LastUpdated}]->(g:PSNGame {NPCOMMID : game.NPCOMMID})-[:LOCALE]->(l:PSNGameLocalized {NPCOMMID : game.NPCOMMID}) 
                SET g = game, 
                    l = { NPCOMMID : game.NPCOMMID, 
                         TitleName : game.TitleName, 
                       TitleDetail : game.TitleDetail, 
                            Locale : {locale} 
                        })")
    .WithParams(new
    {
        PSNGames = games.ToList(),
        locale = locale,
        profile = profile
    })
    .ExecuteWithoutResults();

La clave detrás de esto es dejar que Cypher se encargue de los bucles foreach.Ya no tengo que hacer un bucle foreach en el lado de C#.Al pasar parámetros, puedo crear/actualizar dinámicamente nodos y relaciones aprovechando la MERGE dominio.Este enfoque es varias magnitudes más rápido que mi enfoque anterior.Espero que esto pueda ayudar a alguien más con un problema similar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top