2017-09-28 2 views
2
class Picture 

    property :name 
    property :user_ids 

    serialize :user_ids 
end 

Picture.create(name: '1', user_ids: [1,4,5]) 

Comment trouver toutes les images ayant l'ID utilisateur 1 user_ids propriétéNeo4j.rb: comment rechercher des biens serialize tableau ayant

J'essaie ce de manière:

Picture.as(:p).where('ALL(x IN [1] WHERE x IN p.user_ids)') 

Neo4j. version rb - neo4j (8.0.13) Neo4j - 3.1.1 Enterprise

Mais cela ne fonctionne pas. Ou il y a une meilleure façon de stocker tableau et interroger aussi bien, toute aide serait très appréciable


EDIT: Montré Exemple de Bruno & Ma description de noeud ci-dessus, je l'ai utilisé exemple de noeud

enter image description here

L'exemple @Bruno fonctionne correctement.

Voici mon noeud Neo4j vue

enter image description here

match (p:Place) where ALL(x IN [14] WHERE x IN p.from_airport_ids) return p

Ce ne fonctionne pas dans mon cas

class Place 
    include Neo4j::ActiveNode 
    property :name 
    property :from_airport_ids 
    serialize :from_airport_ids 
end 

Créer place via l'API

{ 
    "place":{ 
    "name":"Name", 
    "from_airport_ids":[14,44,67] 
    } 
} 

Est-ce lié à la façon dont mes valeurs de tableau stockées dans le nœud et comment les valeurs d'exemple @Bruno sont stockées?

+0

solution de Bruno est probablement le meilleur, mais je soupçonne que la raison pour laquelle votre solution ne fonctionne pas parce que vous utilisez 'all'. Je pense que 'ANY' fonctionnerait mieux –

+0

@BrianUnderwood J'ai créé un noeud avec' create (: Picture {name: '1', user_ids: [1,4,5]}) ', a effectué la requête' MATCH (p) où ALL (x IN [1] WHERE x IN p.user_ids) retourne p' et a travaillé. Mais je suis d'accord avec vous que l'approche utilisant l'opérateur IN est au moins plus lisible. –

+0

@BrianUnderwood Peut-être a un message d'erreur pas informé –

Répondre

2

Essayez de changer votre requête:

Picture.as(:p).where('1 IN p.user_ids)') 

C'est: toutes les p s où p.user_ids 1. contient

Aussi, je crois que vous devez stocker des relations entre :User et :Picture nœuds au lieu d'un tableau des identifiants en :Picture. C'est une manière plus graphique de faire les choses.

Quelque chose comme

  -[:CONNECTED_TO]->(:User {id:1}) 
     /
(:Picture)-[:CONNECTED_TO]->(:User {id:2}) 
      \ 
      -[:CONNECTED_TO]->(:User {id:3}) 
+0

J'ai édité la question, la requête ci-dessus ne fonctionne pas non plus, votre exemple (dans le commentaire) fonctionne bien, Aussi j'ai donné la vraie description du Node en question. Image, l'utilisateur étaient juste des exemples, Mais merci de l'expliquer –

+0

@VG 'J'ai créé un noeud avec' créer (: Place {nom: "Nom", from_airport_ids: [14,44,67]}) et a couru la requête 'match (p: Place) où ALL (x IN [14] WHERE x IN p.from_airport_ids) retourne p' cela me renvoie le noeud. Ce n'est pas le comportement désiré? –

+0

Lorsque je crée le nœud directement à partir de la console neo4j, la requête fonctionne bien, mais lorsque je la crée via Active :: Node alors la même requête ne fonctionne pas, j'ai téléchargé l'instantané dans chatroom –