Вопрос

Я пытаюсь найти отношения между узлами с необязательными, но специфическими узлами / отношениями между ними (neo4j 2.0 M6).

В моей модели данных "Ген" может быть "ЧАСТЬЮ"группы "а".У меня есть отношения "ВЗАИМОДЕЙСТВИЯ" между "Геном" - "Ген", "Ген" - "Группа" и "Группа"- "Группа" (красные линии на изображении модели).

Я хочу свести это ко всем отношениям "ВЗАИМОДЕЙСТВИЯ" между "генами":оба прямые (Gene-INTERACT-Gene) и через одну или две "группы" (Gene-PARTOF-Group-INTERACT-Gene).


enter image description here


Конечно, это легко сделать с помощью нескольких шифровальных запросов:

# direct INTERACT
MATCH (g1:Gene)-[r:INTERACT]-(g2:Gene) RETURN g1, g2
# INTERACT via one Group
MATCH (g1:Gene)-[:PARTOF]-(gr:Group)-[r:INTERACT]-(g2:Gene) RETURN g1, g2
# INTERACT via two Group
MATCH (g1:Gene)-[:PARTOF]-(gr1:Group)-[r:INTERACT]-(gr2:Group)-[:PARTOF]-(g2:Gene)
RETURN g1, g2

Но можно ли было бы создать один зашифрованный запрос, который выполняет необязательные "Групповые шаги" в пути?До сих пор я использовал только необязательные связи и shortestPaths, но я понятия не имею, могу ли я отфильтровать один или два необязательных узла между двумя генами.

Это было полезно?

Решение

Вы можете назначить глубину от нуля до единицы для каждой из связей, которые вы добавляете к пути.Попробуйте что-нибудь вроде

MATCH (g1:Gene)-[:PARTOF*0..1]-(gr1)-[:INTERACT]-(gr2)-[:PARTOF*0..1]-(g2:Gene) 
RETURN g1,g2

и чтобы увидеть, как на самом деле выглядят совпадающие пути, просто верните весь путь целиком

MATCH p=(g1:Gene)-[:PARTOF*0..1]-(gr1)-[:INTERACT]-(gr2)-[:PARTOF*0..1]-(g2:Gene) 
RETURN p

Однако существует небольшая проблема с объявлением меток узлов для необязательных частей этого шаблона, поэтому этот запрос предполагает, что гены не являются частью чего-либо, кроме групп, и что они взаимодействуют только с группами и другими генами.Если ген может иметь [:PARTOF] тогда к чему-нибудь другому (gr1) свяжет это с чем-то, и запрос больше не будет надежным.Просто добавив предложение where, например

WHERE gr1:Group AND gr2:Group

исключает случай, когда необязательные части не совпадают, так что это не сработает (это было бы похоже на ваш третий запрос).Я уверен, что это можно решить, но если ваша фактическая модель не намного сложнее, чем то, что вы описываете в своем вопросе, это должно быть сделано.

Я взял на себя смелость интерпретировать вашу модель в консоли здесь, проверьте это, чтобы увидеть, делает ли это то, что вы хотите.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top