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

时间:2017-04-08 21:01:26

标签: neo4j spring-data-neo4j

我有名称和id属性的节点。这些节点与其他节点具有友好关系。喜欢{John} - [朋友] - > {Paul},{John} - [朋友] - > {Jose},{Jose} - [朋友] - > {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的朋友,这应该列出我保罗和jose。我怎么做 ?尝试以下并得到空的结果。无法弄清楚为什么

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

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

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

另外,您需要确保从匹配中的正确变量返回参数。

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

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

试试这个:

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