首页 > 解决方案 > Neo4j 中的 Cypher 查询以查找具有大多数路径匹配模式的特定节点

问题描述

我有一个 neo4j 数据库,其中包含有关水和废物的统计信息。在这个数据库中是与相关事实相关联的数据点,包括到内部定义的映射。随附的屏幕截图中是数据点和相关元数据的示例。中心的节点是值,由“HAS_DIMENSION”链接的直接节点是数据提供者附带的维度。这些不是固定的,而是根据提供者而改变。每个感兴趣的维度都映射到一个内部定义。目前这是我的查询:

MATCH (o:Observation {uq_id:'e__ABS_AGR_AQ__FSW__MIO_M3__BG__1970____9f07c7a629625e5ae00e35838fcd4f824a3593dd'})-[:HAS_DIMENSION]->()
MATCH (o)-[:HAS_DIMENSION]->()-[:HAS_SYNONYM_FROM]->()-[:WITH_TARGET_DEF]->(v:Variable)<-[:HAS_UNIT]-(u:Unit)
MATCH (o)-[vl0:HAS_DIMENSION]->()-[:HAS_SYNONYM_FROM]->()-[:WITH_TARGET_DEF]->(l:Location)
MATCH (o)-[vc0:HAS_DIMENSION]->()-[:HAS_SYNONYM_FROM]->()-[:WITH_TARGET_DEF]->(c:Country)
MATCH (o)-[vy0:HAS_DIMENSION]->()-[:HAS_SYNONYM_FROM]->()-[:WITH_TARGET_DEF]->(y:Year)
MATCH (o)-[:HAS_DIMENSION]->(unk0)
MATCH (o)-[sr0:CAME_FROM_FILE]->(ds0)-[sr1:BELONGS_TO]->(s0)
OPTIONAL MATCH (o)-[dtr0:HAS_DIMENSION]->()-[:HAS_SYNONYM_FROM]->()-[:WITH_TARGET_DEF]->(d:DataType)
RETURN *

我遇到的问题以粉红色圆圈为例。我只想要查询中的一个粉红色圆圈(这是一个带有标签变量的节点),特别是我想要如下的变量

MATCH (v:Variable)<-[:MAPS_TO]-()<-[:HAS_DIMENSION]-(o:Observation)

通过这一点,我想强制它观察一个模式,在该模式中,它识别出与上述模式匹配的单个变量,用于最多数量的中间节点。因此,“新鲜地表水提取”变量将匹配此模式,因为它有两个匹配此模式的路径。但是“抽取的新鲜地下水”不会,因为它只有一个。我怎么能做到这一点?

示例图

标签: databasegraphneo4jcypher

解决方案


听起来您想返回通向它的路径数量最多的变量节点。这样的事情会大致返回您所追求的结果吗?您将需要根据匹配的语句进行调整。

MATCH p=(o:Observation {uq_id:'<your_id>'})-[:HAS_DIMENSION]->()<-[:MAPS_TO]-(v:Variable)
RETURN v.name, COUNT(p) as p ORDER BY p DESC LIMIT 1

推荐阅读