[Neo4j][Cypher Query]过滤节点或关系节点属性,然后返回所有节点及其关系节点

um6iljoc  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(173)

我有一个Neo4j数据库,它包含Resource节点和几个关系节点,包括TagAddressPhoneNumber等。
Resource的架构如下:

Resource: {
  name: str,
  description: str,
  legal_name: str,
  organization_type: str,
}

字符串
Tag的架构如下:

Tag: {
  tag: str,
}


我正在构建一个查询,它返回所有Resource节点沿着它们的关系节点,其中Resource节点具有包含特定字符串的属性,并且/或者相关的Tag节点具有包含相同字符串的属性。
返回的示例案例:

  1. Resource节点确实有一个或多个包含字符串“school”的属性,但所有相关的Tag节点都不具有包含字符串“school”的tag属性:Resource节点将沿着其所有关系节点一起返回
  2. Resource节点没有任何包含字符串“school”的属性,但至少有一个相关的Tag节点具有包含字符串“school”的tag属性:Resource节点与其所有关系节点一起沿着返回
  3. 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);

jqjz2hbq

jqjz2hbq1#

你可以尝试这样的查询:

MATCH (n:Resource)
WHERE EXISTS {
    MATCH (n)-[*0..1]->(x)
    WHERE (x:Resource OR x:Tag)
    AND any(prop IN ['name', 'description', 'legal_name', 'organization_type', 'tag'] WHERE x[prop] CONTAINS 'school')
}

WITH n, [(n)-[]->(m) | m] as resources
RETURN n, resources;

字符串
这使用EXISTS {}子查询来表示您正在查找一个节点(可以是同一个节点,也可以是一个连接的节点),该节点是一个:Resource或:Tag节点,具有任何给定的属性,属性值包含'school'。
对于通过该过滤器的结果节点,THEN可以匹配并收集连接的节点(尽管在本例中我使用了模式理解来这样做,这将更有效)。
编辑:修正了AND和OR运算符的分组,这应该确保必须始终考虑any()列表 predicate 。

ztigrdn8

ztigrdn82#

Tags看起来很像标签。它们的一个属性tag可以很容易地成为标签标识符。使用标签作为标签, predicate 可以简化为:

WITH ['name', 'description', 'legal', 'organization_type'] AS props
MATCH (n:Resource)-->(m) 
WHERE n:School OR any(prop IN props WHERE m[prop] CONTAINS 'school')
RETURN n, collect(m);

字符串

相关问题