Neo4J / Cypher查询帮助

时间:2014-08-05 23:04:50

标签: neo4j cypher neo4jclient

我正在对图形数据库系统进行一些研究,作为POC的一部分,可能会将系统移动到。我对这个概念很陌生,来自RDBMS背景。

我有一个模型(架构?),看起来像:

Person-[HAS_NAME {type:First|Middle|Last}]-Name
Person-[WAS_BORN_ON]-DateOfBirth
Person-[RESIDES_AT {type:Current|Previous}]-Address

我能够在C#应用程序中使用Neo4J和Neo4JClient完美地存储这些数据。

我在背后摔倒的地方是我要离开商店,人员列表以及连接到该人的所有节点(例如他们的名字,DateOfBirth和地址),满足某些条件,

我从这开始:

MATCH (dob:DateOfBirth)-[WAS_BORN_ON]-(person:Person)-[HAS_NAME]-(name:Name) WHERE dob.Id = '1954-05-09' RETURN person, dob, name

它产生的东西很棒:

Full Results

但是我想把它限制在(姓氏)"威廉姆斯"所以我选择这个

MATCH (dob:DateOfBirth)-[WAS_BORN_ON]-(person:Person)-[HAS_NAME]-(name:Name) WHERE dob.Id = '1954-05-09' and name.Value = 'Williams' RETURN person, dob, name"

不幸的是,它删除了所有其他名称: Results with Missing Nodes

不幸的是我想要这个:

Perfect World

2 个答案:

答案 0 :(得分:1)

也许这样的事情可行吗?

MATCH (dob:DateOfBirth{Id: "1954-05-09"})<-[:WAS_BORN_ON]-(person:Person)
WITH dob, person
MATCH (person)-[:HAS_NAME]->(surname:Name{Value: "Williams"})
WITH person, dob
MATCH (person)-[:HAS_NAME]->(name:Name)
RETURN person, dob, name

修改:更新了查询以提高ulkas建议的效果。

答案 1 :(得分:0)

我会走简单路线......

match (dob:DateOfBirth{Id: "1954-05-09"})--(p:Person)--(surname:Name{Value: "Williams"})
optional match (p)--(n:Name)
return dob, p, n

或者使用WHERE子句:

match (dob:DateOfBirth)--(p:Person)--(surname:Name)
optional match (p)--(n:Name)
where dob.Id = "1954-05-09" and surname.Value = "Williams"
return dob, p, n

但话又说回来,我不是表现方面的专家;我首先关注简单性。