测试neo4j/弹簧数据中是否存在关系

测试neo4j/弹簧数据中是否存在关系,neo4j,cypher,spring-data-neo4j,Neo4j,Cypher,Spring Data Neo4j,我试图解决一个简单的问题,如果在一个具有knows关系的图中,某个人a认识某个人B。理想情况下,我会用true或false来回答这个问题,但我没有解决这个问题 我在另一个例子中发现了以下内容,这几乎就是我想要的,除了回答我的问题之外,它还改变了图表: MATCH (p:Person {userId: {0}}), (b:Person {userId: {1}}) MERGE (p)-[r:KNOWS]->(b) ON CREATE SET r.alreadyExisted=false

我试图解决一个简单的问题,如果在一个具有knows关系的图中,某个人a认识某个人B。理想情况下,我会用true或false来回答这个问题,但我没有解决这个问题

我在另一个例子中发现了以下内容,这几乎就是我想要的,除了回答我的问题之外,它还改变了图表:

MATCH  (p:Person {userId: {0}}), (b:Person {userId: {1}}) 
MERGE (p)-[r:KNOWS]->(b) 
ON CREATE SET r.alreadyExisted=false 
ON MATCH SET r.alreadyExisted=true 
RETURN r.alreadyExisted;
最后,我想把它放在SpringNeo4j存储库中,就像这样

public interface PersonRepository extends GraphRepository<Person> {
    boolean knows(final Long me, final Long other);
}

这意味着如果有一种不用密码的方法——使用Springs查询和Finder方法,那也可以。

这是一个简单的密码查询,这里的关键是EXISTS函数,如果给定给函数的模式在图中存在,它将返回一个布尔值

这是密码查询

MATCH  (p:Person {userId: {0}}), (b:Person {userId: {1}}) 
RETURN EXISTS( (p)-[:KNOWS]-(b) )
您甚至可以使其更加简洁:

RETURN EXISTS( (:Person {userId: {0}})-[:KNOWS]-(:Person {userId: {1}}) )

作为对@InverseFalcon所说内容的竞争

//首先 匹配p:Person{userId:{0}},b:Person{userId:{1} 返回存在p-[:知道]-b //第二 返回存在:Person{userId:{0}}-[:KNOWS]:Person{userId:{1} 所提供的两个示例之间存在差异:

第一种方法在断开连接的模式之间构建笛卡尔积

如果查询的一部分包含多个断开连接的模式,这将在所有这些部分之间构建笛卡尔乘积。这可能会产生大量数据并减慢查询处理速度。虽然偶尔有意这样做,但通常可以通过添加不同部分之间的关系或使用可选的匹配来重新格式化查询,从而避免使用此交叉乘积

它仅仅意味着如果你的数据库中有5个人,p={0,1,2,3,4}

第一个查询几乎检查每两个人之间是否存在| A | x | A |=5x5=25条可能路径,其中第一个人节点的id等于`0,第二个人节点的id等于1。 第二个查询检查id为0的Person节点和id为1的Person节点的路径是否存在。 原因也可能是函数和关键字,约定建议将函数写为小写,将其他函数写为大写

//使用存在子查询进行筛选。 哪里有{ 匹配n->m,其中n.userId=m.userId } 此外,还可以将返回值重命名为某个新变量,例如:

返回存在:Person{userId:{0}}-[:KNOWS]:Person{userId:{1}}as KNOWS
非常感谢-我正在尝试EXISTS函数,但不知道如何声明关系必须存在!一个小的改变是必要的,我知道关系是有方向性的,所以A可以知道B而B不知道A。我把它改为p-[:知道]->B,它成功了!