Neo4J分别计算节点之间的关系

Neo4J分别计算节点之间的关系,neo4j,cypher,Neo4j,Cypher,在我的社交媒体应用程序中,我有一个朋友的neo4j db,发布、评论、分享这样的关系 节点 边缘 我正在寻找一个从所有帖子返回所有数据的查询 由我或 别在我身上还是 贴在我的一个朋友身上 包括每个职位的同类关系和共享关系的计数。除此之外,我还想从每个与其中一篇文章有过账关系的用户返回user_id。 所有这些订单都是由DESC创建的 我想要的结果是这样的 { { user_id:56, text:'This is a test', tit

在我的社交媒体应用程序中,我有一个朋友的neo4j db,发布、评论、分享这样的关系

节点

边缘

我正在寻找一个从所有帖子返回所有数据的查询 由我或 别在我身上还是 贴在我的一个朋友身上 包括每个职位的同类关系和共享关系的计数。除此之外,我还想从每个与其中一篇文章有过账关系的用户返回user_id。 所有这些订单都是由DESC创建的

我想要的结果是这样的

{ 
    {
        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
    }
}
这不管用

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

甚至有没有一种方法可以在一个查询中获得这些信息?

什么不起作用?你回来干什么?这将是一个无效的密码查询,因为排序前有一个悬空的逗号

这是您的cypher查询的清理版本

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

如果这不起作用,您可以提供testdb或cypher语句来创建要操作的图形吗?这将有助于为您的问题找到一个好的解决方案。

此查询应该可以:

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;

它收集符合
帖子
集合中每个标准的帖子,过滤重复的帖子,查找发布帖子的用户,并按所需顺序返回结果。

感谢您的快速响应。这个查询对我来说非常有意义,但是每当我在代码中尝试这个问题时,我在调用result.hasNext()的行中会遇到一个“意外失败”,因为这是一个纯粹与密码相关的问题,您应该创建一个新问题,并包含有关代码的详细信息。
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
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;