【问题标题】:Java Neo4j Cypher Or MatchJava Neo4j 密码或匹配
【发布时间】:2016-04-02 04:13:03
【问题描述】:

我有一个图表,用户可以有一个帖子,也可以有一个朋友有一个帖子,这个朋友可以关注也可以不关注。
如何查询用户和他关注的朋友的所有帖子?
我试过这个:

  " MATCH (u1:User)-[:POSTED]->(p1:Post)"
+ " WHERE u1.username =~ '"+user+"'"
+ " OPTIONAL MATCH (u3:User)-[:FOLLOWING]->(u2:User)-[:POSTED]->(p2:Post),"
+ " (u3:User)-[:FRIEND_OF]->(u2:User)"
+ " WHERE u3.username =~ '"+user+"' return u1.username, u1.name,"
                        + "p1 ,u2.username, u2.name , p2";

但是这个查询返回重复,假设我们有我们的用户和朋友。
朋友有一个帖子,用户有两个,对于每个 MATCH,查询返回朋友的帖子两次,查询还返回 OPTIONAL MATCH 的结果。

进一步解释:

(u:User)-[:POSTED]->(p:Post)
(u:User)-[:FRIEND_OF]->(u2:User)
(u:User)-[:FOLLOWING]->(u2:User)-[:POSTED]->(p2:Post)

这些是存在的关系,我想要的是所有满足这些关系的帖子 (:Post),没有重复,最好是单个查询。

【问题讨论】:

    标签: java neo4j cypher


    【解决方案1】:

    首先,您的查询比它需要的复杂得多。这个更简单的查询应该是等效的。我假设{user} 是作为parameter 提供的。

    MATCH (u1:User {username: {user}})-[:POSTED]->(p1:Post)
    OPTIONAL MATCH
      (u1)-[:FOLLOWING]->(u2:User)-[:POSTED]->(p2:Post),
      (u1)-[:FRIEND_OF]->(u2)
    RETURN u1.username, u1.name, p1, u2.username, u2.name, p2;
    

    您获得具有相同p2 值的多行的原因是因为您的RETURN 子句同时返回与u1u2 相关的值。如果有N u1/p1 结果和M u2/p​​2 结果,那么您将获得N*M 结果行。

    要获得包含 N 行的结果(每个 u1/p2 结果一行),您可以使用以下查询:

    MATCH (u1:User {username: {user}})-[:POSTED]->(p1:Post)
    OPTIONAL MATCH
      (u1)-[:FOLLOWING]->(u2:User)-[:POSTED]->(p2:Post),
      (u1)-[:FRIEND_OF]->(u2)
    RETURN
      u1.username, u1.name, p1,
      COLLECT({username: u2.username, name: u2.name, p2: p2}) AS friends;
    

    每个结果行都有一个 friends 集合,其中包含每个相关朋友的数据。

    【讨论】:

    • 感谢您的回答,但我无法遍历集合我尝试了stackoverflow.com/questions/31554217/… 中的解决方案没有帮助,我仍然收到错误 scala.collection.convert.Wrappers$MapWrapper cannot be cast到 org.neo4j.graphdb.Node
    • 那个SO问题不适合收藏。您不应该尝试迭代仅包含节点的列。并且无法迭代结果确实是一个单独的问题。您应该创建一个新问题。
    • 我确实设法使用: [code] scala.collection.convert.Wrappers.IteratorWrapper it = ((SeqWrapper) row.get("friends")).iterator(); while(it.hasNext()){ MapWrapper m = (MapWrapper)it.next();节点 n = (Node)m.get("p2"); for (String key : n.getPropertyKeys()) { System.out.println("Key: " + key + ", Value: " + n.getProperty(key)); } }[/code] 问题是 scala.collection.convert.Wrappers 包是否包含在每个 java 安装中?
    • 如果用户没有帖子,这不会返回任何内容,在这种情况下我想要关注的朋友
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    相关资源
    最近更新 更多