Neo4j,匹配关系 WHERE AND

3

你好,我正在尝试使用“WHERE AND”匹配neo4j关系。

我的示例关系是:“用户访问国家”。

我创建它的方式如下...

MATCH (c:Country{Name:Country}) MERGE (u:User{Email:Email,UserID: UserID}) MERGE (u)-[r:Visits]->(c)
//Countries are previously created and Users may or may not exist

然后我查询(这个有效):

MATCH (u:User)-[r:Visits]->(c:Country) where c.Name='France' or c.Name='Spain' return u

结果:展示所有访问过西班牙或法国的用户,即使他们只访问了其中一个国家。

但是我想做的是同样的查询,但使用“AND”而不是“OR”。这将允许我获取访问了法国和西班牙的用户。

MATCH (u:User)-[r:Visits]->(c:Country) where c.Name='France' AND c.Name='Spain' return u

结果:找不到0个节点和关系。

我该怎么办?

3个回答

9

在你的查询中,你正在匹配一个单独的国家节点,并说这个节点的名称必须是FranceSpain

你想要找到所有访问过法国和西班牙的用户。有几种方法可以实现...

//match both countries against the same user and identify them separtely
//making two matches in a single query
MATCH (u:User)-[:VISITS]->(c1:Country), (u)-[:VISITS]->(c2:Country)
WHERE c1.name = "France"
AND c2.name = "Spain"
RETURN u.name

//match all users that have been to either and only return the one that have been to both
MATCH (u:User)-[r:VISITS]->(c:Country) 
WHERE (c.name IN [ "France", "Spain"])
WITH u, count(*) AS num
WHERE num = 2
RETURN u.name, num 

我认为第一种方法更好,因为它更精确,可能更有效率。


3
如果你只关心两个国家,除了@DaveBennett提供的选项外,这个查询也可以使用。
MATCH (c1)<-[:VISITS]-(u)-[:VISITS]->(c2)
WHERE c1.name = "France" AND c2.name = "Spain"
RETURN u.name;

2

你的查询有什么问题

MATCH (u:User)-[r:Visits]->(c:Country) 
where c.Name='France' 
AND c.Name='Spain' 
return u

这会始终返回零行,因为您尝试检查同一节点属性的两个值。

解决方案

MATCH (c1:Country)<-[r:Visits]-(u:user)-[r1:Visits]->(c2:Country)
WHERE c1.name = 'France' AND c2.name = 'Spain'
RETURN u.name;

这将返回您所需的内容。

这是一份短小而实用的Neo4j参考文档: http://neo4j.com/docs/2.1.2/cypher-refcard/


Satish,你的答案和cybersam有什么不同之处(当然标签除外)? - Dave Bennett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接