[英]Match nodes connected to same intermediary - cypher/neo4j
我正在处理带有用术语节点标记的内容节点的图。 我正在尝试查询返回与其他(搜索)术语节点连接到相同内容节点的(匹配)术语节点的查询。
(matched:term)--(contentNode:content)--(search:term)
我遇到的问题是返回匹配的术语节点,这些节点连接到已连接所有搜索词而不是任何搜索词的内容。
这是我当前查询的简化版本:
query = [
'MATCH (matched:term)<-[:TAGGED_WITH]-(contentNode:content)-[:TAGGED_WITH]->(searchTerms:term) ',
'WHERE searchTerms.UUID IN {searchTerms} ',
'RETURN DISTINCT matched.name AS name, matched.UUID AS UUID, matched.contentConnections AS connections ',
'ORDER BY connections DESC LIMIT 10'
].join('\n');
这是一个实际的示例-术语的顶部是与我的查询匹配的术语,底部是用于搜索的术语:
术语“天文学”不应返回,这是因为某些标有“图像”的内容也标有“天文学”。
结果的图形表示:
请注意,只有一个内容(灰色节点)与两个术语都匹配(这很难说,因为节点ID是显示的内容)。 期望的是仅返回与同时被“图像”和“器官”标记的内容相关的术语
另一个例子:
此搜索不应产生任何术语,因为没有内容被同时标记为“器官”和“天文学”,但是,它返回的术语都被标记为其中一个。
图形表示:
我希望我已经阐明了我的问题。 我试过使用count()
将结果分组,但是努力使其工作。
任何帮助,将不胜感激。
编辑:
查询:
query = [
'MATCH (contentNode:content)-[:TAGGED_WITH]->(searchTerms:term) ',
'WITH contentNode, COUNT(contentNode) as countContent, searchTerms ',
'WHERE searchTerms.UUID IN {searchTerms} AND countContent = {searchTermsCount} ',
'MATCH (typeNode:termType)<-[:IS_TYPE]-(matched:term)<-[:TAGGED_WITH]-contentNode, ',
'matched-[:HAS_LANGUAGE {languageCode: {language} }]-(termMeta:termMeta) ',
'WHERE NOT matched.UUID IN {ignoreTerms}',
'RETURN DISTINCT termMeta.name AS name, matched.UUID AS UUID, matched.contentConnections AS connections ',
'ORDER BY connections DESC LIMIT 10'
].join('\n');
选择以下两个术语后,查询将返回标有那些内容(“进化”,“蚂蚁”等)中任何一个的术语,但是,使用上述查询不会返回任何术语。
您可以尝试将查询分为两部分:
MATCH (contentNode:content)-[:TAGGED_WITH]->(searchTerms:term)
WHERE searchTerms.UUID IN {searchTerms}
WITH contentNode, COUNT(*) as cnt
WHERE cnt = {_searchTerms_size_}
MATCH (matched:term)<-[:TAGGED_WITH]-contentNode
RETURN DISTINCT matched.name AS name, matched.UUID AS UUID, matched.contentConnections AS connections
ORDER BY connections DESC LIMIT 10
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.