我有一个Neo4j数据库,它包含Resource
节点和几个关系节点,包括Tag
、Address
、PhoneNumber
等。Resource
的架构如下:
Resource: {
name: str,
description: str,
legal_name: str,
organization_type: str,
}
字符串Tag
的架构如下:
Tag: {
tag: str,
}
型
我正在构建一个查询,它返回所有Resource
节点沿着它们的关系节点,其中Resource
节点具有包含特定字符串的属性,并且/或者相关的Tag
节点具有包含相同字符串的属性。
返回的示例案例:
Resource
节点确实有一个或多个包含字符串“school”的属性,但所有相关的Tag
节点都不具有包含字符串“school”的tag
属性:Resource
节点将沿着其所有关系节点一起返回Resource
节点没有任何包含字符串“school”的属性,但至少有一个相关的Tag
节点具有包含字符串“school”的tag
属性:Resource
节点与其所有关系节点一起沿着返回Resource
节点具有一个或多个包含字符串“school”的属性,并且至少有一个相关的Tag
节点具有包含字符串“school”的tag
属性:Resource
节点与其所有关系节点一起沿着返回
我目前正在使用下面的查询,它在大部分情况下都有效;然而,对于上面的情况2,在结果集中没有返回原始Resource
节点的其他关系节点。理想情况下,我们总是会得到Resource
节点的所有关系节点匹配上述条件。任何帮助都将非常感谢!
MATCH (n:Resource)-[]->(m)
WHERE n.name CONTAINS 'school'
OR n.description CONTAINS 'school'
OR n.legal_name CONTAINS 'school'
OR n.organization_type CONTAINS 'school'
OR m.tag CONTAINS 'school'
RETURN n, collect(m);
型
2条答案
按热度按时间jqjz2hbq1#
你可以尝试这样的查询:
字符串
这使用EXISTS {}子查询来表示您正在查找一个节点(可以是同一个节点,也可以是一个连接的节点),该节点是一个:Resource或:Tag节点,具有任何给定的属性,属性值包含'school'。
对于通过该过滤器的结果节点,THEN可以匹配并收集连接的节点(尽管在本例中我使用了模式理解来这样做,这将更有效)。
编辑:修正了AND和OR运算符的分组,这应该确保必须始终考虑any()列表 predicate 。
ztigrdn82#
Tags
看起来很像标签。它们的一个属性tag
可以很容易地成为标签标识符。使用标签作为标签, predicate 可以简化为:字符串