我有一个大的图,其中有代表人的节点。它们都有名字和姓氏属性,有些有中间名属性。我在寻找可能代表同一个人的节点,所以我在看名字的不同排列。我目前正在比较姓氏和名字的首字母[一些节点只有首字母],但不知道如何测试中间名,如果它们存在的话。
我当前的查询是:
match (a:Author), (b:Author)
where
a.surname=b.surname and
( a.firstname starts with 'A' and b.firstname starts with 'A')
return distinct a,b
我的理解是,OPTIONAL MATCH只指模式,所以这是行不通的。我找不到一个有意义的if语句。
这可能是更有意义的对我来说,这样做编程,而不是仅仅依赖于直接Cypher查询,但我希望保持它真的很简单,只是做它在Cypher。
一些例子来说明我想做什么。
示例1:
Node 1: firstname "John" middlename "Patrick" lastname "Smith"
Node 2: firstname "J" middlename "P" lastname "Smith"
Node 3: firstname "J" middlename "Q" lastname "Smith"
Node 4: firstname "J" lastname "Smith"
我想要一个查询,将返回节点1,2和4作为'匹配'。
示例2:
Node 1: firstname "Jane" lastname "Smith"
Node 2: firstname "J" middlename "P" lastname "Smith"
Node 3: firstname "J" middlename "Q" lastname "Smith"
Node 4: firstname "J" lastname "Smith"
这里,我想要所有4个节点,因为"规范"名称没有中间名。
我认为您需要以下内容:
match (a:Author), (b:Author)
where
id(a) < id(b) and
( a.surname=b.surname) and
( a.firstname starts with 'A' and b.firstname starts with 'A') and
( a.middlename=b.middlename OR a.middlename IS NULL OR b.middlename IS NULL)
return a,b
如何使用null是一个很好的参考,像你正在处理的谜题。
EDIT:让我们用一些伪代码来分解它:
if (a.middlename is null) return true;
if (b.middlename is null) return true;
if (a.middlename is not null and b.middlename is not null and a.middlename!=b.middlename) return false;
if (a.middlename is not null and b.middlename is not null and a.middlename=b.middlename) return true;