2016-12-01 1 views
-2

Dans mon application des médias sociaux, j'ai db Neo4j pour l'AMI, PARUTION, LIKE, COMMENTAIRE, les relations SHARE comme ceNeo4j compte des relations de nœuds séparément

nœuds

(User{user_id}) 
(Post{title, text, created, picture}) 

Arêtes

(User)-[:FRIEND]->(User) 
(User)-[:POSTED]->(Post) 
(Post)-[:PINNED]->(User) 
(User)-[:LIKE]->(Post) 
(User)-[:SHARE]->(Post) 

Je suis à la recherche d'une requête qui renvoie toutes les données de tous les messages Posté par moi OU PINNED à moi OU POSTED AND PINNED à un AMI de moi en incluant le compte de LIKE Relations et SHARE Relations de chaque poste. En plus de cela, je veux retourner le user_id de chaque utilisateur avec une relation POSTED à l'un de ces messages. Tout cela ORDER BY créé DESC.

Le résultat im recherche serait quelque chose comme ça

{ 
    { 
     user_id:56, 
     text:'This is a test', 
     title:'This is a title', 
     created:'2016.12.01.18.00.00' 
     post_picture:'', 
     likecount:9, 
     sharecount:3 
    }, 
    { 
     user_id:52, 
     text:'This is a test', 
     title:'This is a title', 
     created:'2016.12.01.17.00.00' 
     post_picture:'', 
     likecount:12, 
     sharecount:4 
    } 
} 

Cela ne fonctionne pas

MATCH (post)-[:POSTED]-(user:User)-[:FRIEND]-(friend:User) 
WHERE (user{user_id:'97'})-[:POSTED]-(post) 
OR (user{user_id:'97'})-[:PINNED]-(post) 
OR (friend{user_id:'97'})-[:FRIEND]-(user)-[:PINNED]-(post) 
AND(friend{user_id:'97'})-[:FRIEND]-(user)-[:POSTED]-(post) 
OPTIONAL MATCH (post)-[liked:LIKE]-(b:User) 
OPTIONAL MATCH (post)-[share:SHARE]-(d:User) 
WITH post, user, count(liked) as likecount, 
count(share) as sharecount 
RETURN DISTINCT 
user.user_id as user_id, 
post.title as title, 
post.text as text, 
post.picture as post_picture, 
post.created as created, 
likecount, 
sharecount, 
ORDER BY created DESC 

est-il même un moyen d'obtenir tout cela en une seule requête?

Répondre

0

Ce qui ne fonctionne pas? Qu'est-ce que tu récupères? Ce serait une requête de chiffrement invalide, à cause d'une virgule pendante avant ORDERing.

Voici la version nettoyée de votre requête de chiffrement.

MATCH (post)-[:POSTED]-(user:User)-[:FRIEND]-(friend:User) 
WHERE (user{user_id:'97'})-[:POSTED]-(post) 
OR (user{user_id:'97'})-[:PINNED]-(post) 
OR (friend{user_id:'97'})-[:FRIEND]-(user)-[:PINNED]-(post) 
AND(friend{user_id:'97'})-[:FRIEND]-(user)-[:POSTED]-(post) 
OPTIONAL MATCH (post)-[liked:LIKE]-(b:User) 
OPTIONAL MATCH (post)-[share:SHARE]-(d:User) 
WITH post, user, count(liked) as likecount, 
count(share) as sharecount 
RETURN DISTINCT 
user.user_id as user_id, 
post.title as title, 
post.text as text, 
post.picture as post_picture, 
post.created as created, 
likecount, 
sharecount, 
ORDER BY created DESC 

Si cela ne fonctionne pas, peut vous fournir db essai ou une déclaration Cypher qui crée le graphique que vous souhaitez opérer? Cela vous aidera à trouver une bonne solution à votre problème.

2

Cette requête devrait fonctionner:

MATCH (me:User {user_id: 123}) 
OPTIONAL MATCH (me)-[:POSTED]->(p1) 
WITH me, COLLECT(p1) AS posts 
OPTIONAL MATCH (p2)-[:PINNED]->(me) 
WITH me, posts + COLLECT(p2) AS posts 
OPTIONAL MATCH (me)-[:FRIEND]-(friend)-[:POSTED]->(p3)-[:PINNED]->(friend) 
WITH me, posts + COLLECT(p3) AS posts 
UNWIND posts AS post 
WITH DISTINCT post 
OPTIONAL MATCH (poster)-[:POSTED]->(post) 
RETURN post, COUNT(()-[:LIKE]->(post)) AS likes, COUNT(()-[:SHARE]->(post)) AS shares, COLLECT(DISTINCT poster.user_id) AS posters 
ORDER BY post.created DESC; 

Il recueille les messages qui correspondent à chaque critère dans la collection posts, filtre les doublons, trouve les utilisateurs qui ont affiché les messages, et renvoie les résultats dans l'ordre souhaité.

+0

Merci pour la réponse rapide. Cette requête me semble parfaitement logique, mais chaque fois que j'essaie cela dans mon code, j'obtiens un "échec inattendu" à la ligne où j'appelle result.hasNext() – Patrick

+0

Puisqu'il s'agit d'une question purement Cypher, vous devriez créer un nouvelle question et inclure les détails pertinents sur votre code. – cybersam