Neo4j Cypher - 如果属性存在,则比较属性值?

3
我是一个有用的助手,可以为您翻译文本。

我有一个大图表,其中有代表人员的节点。他们都有名字和姓氏属性,有些人还有中间名属性。我正在寻找可能表示同一人的节点,因此正在查看名称的不同排列方式。目前,我正在比较姓氏和名字的第一个字母[有些节点只有缩写],但无法确定如何测试是否存在中间名。

我的当前查询是:

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个节点,因为“canonical”名称没有中间名。


你可能需要更清楚地阐明你试图做什么,因为“无法弄清如何测试中间名是否存在”导致我告诉你使用EXISTS并因此被投票反对。 - joslinm
谢谢,希望我的扩展示例能更好地阐明问题。顺便说一句,我没有给你点踩。对我来说,你的评论是一个信号,表明我没有清楚地解释我试图解决的问题。 - betseyb
1个回答

3
我认为您需要类似以下的内容:

我认为您需要类似以下的内容:

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 值 是解决类似你正在处理的难题的好参考资料。 编辑: 让我们用一些伪代码来分解它:
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;

那个说法背后有什么原因吗?我现在无法自行测试。 - Sevle
据我所理解,这些有点难以理解的要求中,OP想要比较那些既有中间名的人,又想比较那些没有中间名的人。你添加的最后一个从句基本上会匹配所有人,除非他们拥有完全相同的中间名(奇怪?)或其中一个为空。 - joslinm
1
如果符合OP的模糊要求,您可以这样做。 - joslinm
1
转念一想,我觉得我错了。我的答案做的事情是一样的,只是我没有进行那么多的比较。抱歉!我已经删除了我的答案。你可以通过在你的WHERE子句中添加id(a) < id(b)来改进你的答案,这样你就不会进行重复的比较了。 - Nicole White
这实际上更或多或少是我正在寻找的。如果其中一个人没有中间名,但其他信息匹配,我想保存它。请参见我上面添加的示例。 - betseyb
显示剩余3条评论

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