我正在对图形数据库系统进行一些研究,作为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
它产生的东西很棒:
但是我想把它限制在(姓氏)"威廉姆斯"所以我选择这个
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"
不幸的是,它删除了所有其他名称:
不幸的是我想要这个:
答案 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
但话又说回来,我不是表现方面的专家;我首先关注简单性。