【发布时间】:2020-11-09 21:08:30
【问题描述】:
我需要选择所有与其他节点有任何连接的ContentItem 节点。
我还传递了每个节点的 id 列表以用于过滤目的。即,我为我希望在搜索中包含的项目传递了一个 neo4j id 列表。与传入 id 的任何其他节点相关的任何 ContentItem 都应返回。
我尝试过使用 UNION,因为这感觉是最简单的方法,但我不确定它是否正确。
MATCH (n:ContentItem) WHERE id(n) IN $neoIds
WITH n
OPTIONAL MATCH (n:ContentItem)-[:IN]->(pt:PulseTopic) WHERE id(pt) IN $pulseTopics RETURN n
UNION
OPTIONAL MATCH (n:ContentItem)-[:IN]->(pst:SubPulseTopic) WHERE id(pst) IN $subPulseTopics RETURN n
UNION
OPTIONAL MATCH (n:ContentItem)-[:FROM]->(s:Supplier) WHERE id(s) IN $suppliers RETURN n
UNION
OPTIONAL MATCH (n:ContentItem)-[:USED_FOR]->(ua:UseArea) WHERE id(ua) IN $useAreas RETURN n
UNION
OPTIONAL MATCH (n:ContentItem)-[:IN]->(blt:BLTopic) WHERE id(blt) IN $blTopics RETURN n
首先,当我在 python 中引用记录时,我得到一个错误:
for r in tx.run(cypherStep2, paramsStep2):
d = r['n']['id']
...给出:
TypeError: 'NoneType' object is not subscriptable
我不确定为什么会这样。如果我只是做MATCH (n:ContentItem) WHERE id(n) IN $neoIds RETURN n 我不会收到这个错误,所以我认为这与UNION 有关。
其次,我想知道这是否真的会过滤传入的 $neoIds 上的 ContentItem,或者 OPTIONAL MATCH (n:ContentItem) 是否意味着 UNION 中的任何 ContentItem。
请问这样查询的最佳方法是什么?
【问题讨论】: