首页 > 解决方案 > Neo4j Cypher 选择在哪里存在查询

问题描述

我有一个这样的图形结构:在此处输入图像描述

我需要选择ContentItem它们与其他节点有任何连接的所有节点。

我还传递了每个节点的 id 列表以用于过滤目的。即,我为我希望在搜索中包含的项目传递了一个 neo4j id 列表。任何ContentItem与传入了 id 的任何其他节点相关的任何内容都应该返回。

我尝试过使用 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.

其次,我想知道这是否真的会过滤传入的 ContentItem或者$neoIds是否OPTIONAL MATCH (n:ContentItem)意味着.ContentItemUNION

请问这样查询的最好方法是什么?

标签: neo4jcypher

解决方案


好的,我整理好了。首先,我实际上在那里犯了一个错误,因为它是 n.id 值而不是传入的 id(n) 。

其次,由于某种未知的原因,我得到了一个 None 结果。所以我现在只是在 python 中过滤掉它。

第三,似乎我需要将id(n) IN $neoIds放入每个联合查询中。

这似乎不是最好的解决方案,但它确实有效。如果您有任何改进建议,我会很感兴趣。这是代码:

OPTIONAL MATCH (n:ContentItem)-[:IN]->(pt:PulseTopic) WHERE pt.id IN $pulseTopics AND id(n) IN $neoIds RETURN n
UNION
OPTIONAL MATCH (n:ContentItem)-[:IN]->(pst:SubPulseTopic) WHERE pst.id IN $subPulseTopics AND id(n) IN $neoIds RETURN n
UNION
OPTIONAL MATCH (n:ContentItem)-[:FROM]->(s:Supplier) WHERE s.id IN $suppliers AND id(n) IN $neoIds RETURN n
UNION
OPTIONAL MATCH (n:ContentItem)-[:USED_FOR]->(ua:UseArea) WHERE ua.id IN $useAreas AND id(n) IN $neoIds RETURN n
UNION
OPTIONAL MATCH (n:ContentItem)-[:IN]->(blt:BLTopic) WHERE blt.id IN $blTopics AND id(n) IN $neoIds RETURN n

推荐阅读