gpt4 book ai didi

Neo4j Cypher - 比较属性值是否存在?

转载 作者:行者123 更新时间:2023-12-01 07:40:11 25 4
gpt4 key购买 nike

我有一个大图,其中有代表人的节点。它们都具有名字和姓氏属性,有些具有中间名属性。我正在寻找可能代表同一个人的节点,因此我正在查看名称的不同排列。我目前正在比较姓氏和名字的第一个首字母 [有些节点只有首字母],但无法弄清楚如何测试中间名(如果它们存在)。

我当前的查询是:

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

How to work with 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;

关于Neo4j Cypher - 比较属性值是否存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38084054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com