Neo4j 如何优化具有相似特征的三个查询?(塞弗)

Neo4j 如何优化具有相似特征的三个查询?(塞弗),neo4j,cypher,Neo4j,Cypher,我的Neo4j查询有问题。例如,在我的数据库中,我想根据一个人的姓、名和出生年份来选择与他相似的人。如果我找不到任何一个完全匹配的人,那么我将执行查询以查找具有相同姓氏和出生年份的人。最后,如果第二次查询没有找到匹配项,我将进行第三次匹配,以查找是否有人的出生年份与该人的相同。如何将这三个查询合并为一个查询。我认为对于大型数据库来说,这种类型的查询非常广泛,所以我需要一些方法来优化这种逻辑 MATCH (c:Company)-[r:CARRY]->(p:Person {LastName:

我的Neo4j查询有问题。例如,在我的数据库中,我想根据一个人的姓、名和出生年份来选择与他相似的人。如果我找不到任何一个完全匹配的人,那么我将执行查询以查找具有相同姓氏和出生年份的人。最后,如果第二次查询没有找到匹配项,我将进行第三次匹配,以查找是否有人的出生年份与该人的相同。如何将这三个查询合并为一个查询。我认为对于大型数据库来说,这种类型的查询非常广泛,所以我需要一些方法来优化这种逻辑

MATCH (c:Company)-[r:CARRY]->(p:Person {LastName: "Foo", FirstName: "Bar", YOB: 1999 })
RETURN p
如果没有找到答案,我会这样做

MATCH (c:Company)-[r:CARRY]->(p:Person {LastName: "Foo", YOB: 1999 })
RETURN p
如果我仍然找不到答案,我会尝试

MATCH (c:Company)-[r:CARRY]->(p:Person {YOB: 1999 })
RETURN p

我只是想对这种逻辑进行更有效的查询。谢谢您的帮助。

您的查询可以反向执行测试。也就是说,首先进行更一般的测试

在查询的步骤1中,您可以找到所有具有所需的
YOB
Person
节点,这将是最终结果的超集。让我们调用这组节点
p1

在步骤2中,按所需的
LastName
过滤
p1
中的节点集,然后调用生成的子集
p2

在步骤3中,根据所需的
FirstName
过滤
p2
中的节点集,并调用生成的子集
p3

最后,如果不为空,可以返回
p3
,如果不为空,可以返回
p2
,或者返回
p1

下面是一个示例(假定所需的
YOB
LastName
FirstName
值作为以下内容传递):

[更新]

如果要限制
结果
列表的最大大小,只需将查询的最后一行更改为:

  ELSE p1 END[..$limit] AS result

其中,
limit
被假定为一个参数。

您的查询可以反向执行测试。也就是说,首先进行更一般的测试

在查询的步骤1中,您可以找到所有具有所需的
YOB
Person
节点,这将是最终结果的超集。让我们调用这组节点
p1

在步骤2中,按所需的
LastName
过滤
p1
中的节点集,然后调用生成的子集
p2

在步骤3中,根据所需的
FirstName
过滤
p2
中的节点集,并调用生成的子集
p3

最后,如果不为空,可以返回
p3
,如果不为空,可以返回
p2
,或者返回
p1

下面是一个示例(假定所需的
YOB
LastName
FirstName
值作为以下内容传递):

[更新]

如果要限制
结果
列表的最大大小,只需将查询的最后一行更改为:

  ELSE p1 END[..$limit] AS result

其中,
限制
假定为一个参数。

非常感谢!但是这里有一点输入错误,las else应该返回p1,对吗?是的,我已经修正了我的答案。很高兴它对你有效。如果我想在这里施加限制,它似乎不起作用。你知道我怎么做吗?非常感谢!但是这里有一点输入错误,las else应该返回p1,对吗?是的,我已经修正了我的答案。很高兴它对你有效。如果我想在这里施加限制,它似乎不起作用。你知道我怎么做吗?