Neo4j Cypher语言 - 比较存在的属性值



我有一个大的图,其中有代表人的节点。它们都有名字和姓氏属性,有些有中间名属性。我在寻找可能代表同一个人的节点,所以我在看名字的不同排列。我目前正在比较姓氏和名字的首字母[一些节点只有首字母],但不知道如何测试中间名,如果它们存在的话。

我当前的查询是:

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;

最新更新