J'utilise neo4j pour mes projets sociaux où l'utilisateur peut créer une publication et se suivre. Je dois récupérer le post de mon abonné avec mon propre post. Pour récupérer le message de mes abonnés, j'utilise la requête suivante:

MATCH (me:User {UserId: '39434e4d-d501-4fba-8aae-16cf652deb3e'})-[:FOLLOWSS|CREATED]->(f:User)-(p:Posts) RETURN p LIMIT 25 

La requête ci-dessus renvoie le message de mes abonnés, mais je ne parviens pas à obtenir mon propre message. Quelqu'un peut-il me dire ce qui me manque pour obtenir mes propres messages avec celui de mes abonnés

MATCH (me:User {UserId: '39434e4d-d501-4fba-8aae-16cf652deb3e'})-[:FOLLOWSS]->(f:User)-[fc:CREATED|LIKED]-(p:Posts)<-[:CREATED]-(n) RETURN p LIMIT 25

J'ai essayé la requête ci-dessus mais elle ne renvoie aucun enregistrement.

Toute aide serait très appréciée.

Merci.

1
Amit Sharma 20 nov. 2018 à 16:48

3 réponses

Meilleure réponse
MATCH (me:User {UserId: '39434e4d-d501-4fba-8aae-16cf652deb3e'})-[:FOLLOWSS]->(f:User)-[fc:CREATED]-(p:Posts)<-[:CREATED]-(n) RETURN p LIMIT 25

Renvoie tous les messages créés par vous ET par quelqu'un d'autre. Vous devez séparer les variables qui sont des éléments différents

MATCH (mine:Posts)<-[:CREATED]-(me:User {UserId: '39434e4d-d501-4fba-8aae-16cf652deb3e'})-[:FOLLOWSS]->(f:User)-[fc:CREATED]-(p:Posts) RETURN mine, p LIMIT 25

Mais, cela renvoie les informations de manière redondante (chaque message contre chaque message), je vous recommande donc de le compresser avec COLLECT comme ceci.

MATCH (mine:Posts)<-[:CREATED]-(me:User {UserId: '39434e4d-d501-4fba-8aae-16cf652deb3e'})-[:FOLLOWSS]->(f:User)-[fc:CREATED]-(p:Posts)
WITH mine, p LIMIT 25
WITH COLLECT(mine)+COLLECT(p) as posts
UNWIND posts as p
RETURN p LIMIT 25
0
Tezra 4 déc. 2018 à 04:23

À partir de la réponse de @InverseFalcon, voici une requête qui renvoie des données dans des collections intégrées:

MATCH (n:User {name:"ikwattro"})<-[:FOLLOWS*0..1]-(x)-[:CREATED]->(p:Post)
RETURN n, 
[x IN collect(p) WHERE (n)-[:CREATED]->(x) | x.title] AS userPosts, 
[x IN collect(p) WHERE NOT (n)-[:CREATED]->(x) | x.title] AS followersPosts


╒═══════════════════╤═══════════╤═════════════════════════╕
│"n"                │"userPosts"│"followersPosts"         │
╞═══════════════════╪═══════════╪═════════════════════════╡
│{"name":"ikwattro"}│["Post1"]  │["Post4","Post3","Post2"]│
└───────────────────┴───────────┴─────────────────────────┘
1
Christophe Willemsen 21 nov. 2018 à 09:48

Le moyen le plus simple de le faire est d'utiliser une relation de longueur variable facultative, qui peut être obtenue en utilisant une limite inférieure de 0:

MATCH (me:User {UserId: '39434e4d-d501-4fba-8aae-16cf652deb3e'})-[:FOLLOWSS*0..1]->(f:User)-[:CREATED]-(p:Posts) 
RETURN p LIMIT 25 

Le [:FOLLOWSS*0..1] est la clé, car cela signifie qu'il inclura des modèles qui ont la relation: FOLLOWSS avec un autre: nœud utilisateur, ainsi que des modèles où aucune relation n'est traversée (ce qui signifie que votre me utilisateur est le même nœud que le f: nœud utilisateur).

1
InverseFalcon 20 nov. 2018 à 20:38