neo4j - 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)
意味着.ContentItem
UNION
请问这样查询的最好方法是什么?
解决方案
好的,我整理好了。首先,我实际上在那里犯了一个错误,因为它是 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
推荐阅读
- python - 使用while循环从函数返回变量
- mysql - The syntax of this MySQL logic?
- laravel-5 - 使用 swagger 在 laravel 中出现错误 419(未知状态)
- python - 使用 pymc3 对 MCMC 进行采样时,如何在可能性上添加 L1 正则化?
- web - 如何在 Weblogic 12.1.1 中导出数据源
- c - 如何使用 ## 运算符连接和评估宏
- php - PHP只更改ini文件中的一个值
- javascript - 分配给这个 javascript 工厂的参数是什么?
- batch-file - 如何将一行代码发送到另一个批处理文件中,该行中有一个特殊字符
- javascript - Identity.IsAuthenticated 在 ASP.Net Web API 中返回 false