Question

J'ai un ensemble de jeux PlayStation Network et un ensemble de localisations de texte de jeu (titre du jeu, description du jeu, etc.).Je souhaite associer chaque jeu à une locale respective ("en", "fr", "de" par exemple), mais je ne suis pas sûr de la bonne approche ou si c'est la bonne utilisation de la clause FOREACH de Cypher.J'utilise Neo4jClient pour ajouter/mettre à jour des jeux et ajouter/mettre à jour les paramètres régionaux respectifs.Voici le code que j'ai jusqu'à présent :

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();

Ma pensée est d'en faire un autre ForEach appeler et MERGE la relation:

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

Cependant, cela crée de nouvelles étiquettes, nœuds et propriétés PSNGameLocalized :

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

J'avais créé manuellement chaque nœud et ajouté/mis à jour chaque relation, ce qui s'est avéré très lent.J'aime l'idée de transactions groupées pour accélérer l'importation de données.Comment puis-je ajouter/mettre à jour des relations tout en profitant de FOREACH?

Était-ce utile?

La solution

Après réflexion supplémentaire sur la résolution du problème, j'ai abouti à ce qui suit :

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 clé derrière cela est de laisser Cypher s'occuper des boucles foreach.Je n'ai plus besoin de faire une boucle foreach côté C#.En passant des paramètres, je peux créer/mettre à jour dynamiquement des nœuds et des relations en profitant de la MERGE commande.Cette approche est plusieurs fois plus rapide que mon approche précédente.J'espère que cela pourra aider quelqu'un d'autre avec un problème similaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top