在 Neo4j 中查找与输入节点有特定关系的节点

Find nodes that has a particular relationship with the input node in Neo4j

我有名称和 ID 为 属性 的节点。这些节点与其他节点有朋友关系。喜欢{John}-[Friend]->{Paul},{John}-[Friend]->{Jose},{Jose}-[Friend]->{Paul}

创建用户

session.run( "CREATE (a:User {name: {name}, id: {id}})",
            parameters( "name", name, "id", id ) );

建立关系

session.run("MATCH (a:User),(b:User) WHERE a.id = {node1} AND b.id = {node2} CREATE (a)-[r:FRIENDS]->(b)",
            parameters( "node1", id1, "node2", id2 ) );

现在我正在寻找查询 John 的朋友,应该列出我的 paul 和 jose。我怎么做 ?尝试了以下并得到空结果。无法弄清楚为什么

session.run("MATCH (a:User{id:{id}})<-[:FRIEND]-(actor) RETURN a.id",
            parameters( "id", user ) );

感谢您的帮助

您需要确保使用与创建关系时相同的关系类型。在您的创建查询中,您创建了一个 :FRIENDS 关系,但在您的后续查询中,您正在寻找一个 :FRIEND 关系。您需要确保保持一致。

此外,您需要确保 return从匹配中的正确变量中获取参数。

在您的查询中,a 是您的起始节点,因为您提供的是该节点的 ID,但您 return 是同一节点的 ID。我想你的意思是 return actor.id,它引用了比赛另一边的变量。

要记住的另一件事是关系方向。 Neo4j 中的所有关系都有一个方向,但是在许多查询中,您要么不关心关系的方向,要么不知道它是朝哪个方向发展。你的 :FRIENDS 关系就是一个很好的例子,因为当你查询两个用户是否是朋友时,你不会知道或关心方向,所以你可以在查询中省略方向箭头。

试试这个:

session.run("MATCH (a:User{id:{id}})-[:FRIENDS]-(actor) RETURN actor.id",
        parameters( "id", user ) );