Cypher запрос в neo4j, чтобы найти конкретный узел с большинством путей, соответствующих шаблону - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть база данных 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 *

Проблема, которую я имею, иллюстрируется розовыми кружками. Мне нужен только один розовый круг (который является узлом с меткой Variable) в запросе, в частности, я хочу, чтобы переменная была следующей

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

Этим я хочу заставить его наблюдать шаблон, в котором он идентифицируетединственная переменная, которая соответствует шаблону выше для большинства промежуточных узлов. Таким образом, переменная «Абстрагированная пресная вода» будет соответствовать этому шаблону, поскольку она имеет два пути, которые соответствуют этому. Но «Пресная подземная вода забирается» не будет, так как она есть только одна. Как я мог сделать это?

sample graph

1 Ответ

0 голосов
/ 07 ноября 2019

Похоже, вы хотите вернуть узел Variable с наибольшим количеством путей, ведущих к нему. Будет ли что-то вроде этого примерно вернуть результаты, которые вы после? Вам нужно будет адаптироваться в соответствии с вашими соответствующими утверждениями.

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
...