Как я могу присвоить значение свойства узла переменной в Cypher? - PullRequest
0 голосов
/ 12 апреля 2019

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

, т.е. никогда не произойдет следующее, где n0и n1 различны:

(n0:Concept)-[:CONTAINS_OBJECT]->(o:Object)<-[:CONTAINS_OBJECT]-(n1:Concept)

В основном, как это должно быть сделано с Cypher?

Отказ от ответственности: Мы новички в Cypher - любые советы приветствуются.

Мы пробовали несколько более ограниченных запросов, но у нас тоже были проблемы с назначением переменных.

Этот запрос достиг желаемого результата для одного указанного узла «Concept»:

    MATCH p = (c:Concept{ Name: 'Con0' })-[:CONTAINS_OBJECT]->(END)
    FOREACH (n in nodes(p) | SET n:Con0)

Следующий запрос был нашей попыткой привязать свойство «Name» узла «Concept» к переменной », но в этом случае не назначается« p »:

    MATCH p = (c:Concept{ Name: 'Con0' })-[:CONTAINS_OBJECT]->(END)
    WITH c.Name as conceptName
    FOREACH (n in nodes(p) | SET n:conceptName)

Чтобы упроститьрезультат, которого мы добиваемся максимально возможного, конечный результат состоит в том, что следующие два оператора MATCH должны возвращать одинаковые результаты для любого данного узла «Concept»:

1)

    MATCH (c:Concept{ Name: 'Con0' })-[:CONTAINS_OBJECT]->(o:Object)

2)

    MATCH (c:Concept{ Name: 'Con0' })-[:CONTAINS_OBJECT]->(o:Con0)

Хотите построить запрос по следующим строкам:

    MATCH p = (c:Concept)-[:CONTAINS_OBJECT]->(END)
    WITH c.Name as conceptName
    FOREACH (n in nodes(p) | SET n:conceptName)

Ответы [ 2 ]

2 голосов
/ 12 апреля 2019

Мне трудно понять ваш вопрос, так как он использует некоторую терминологию neo4j нестандартными способами.Например, ваш код Cypher использует CONTAINS_OBJECT в качестве «типа отношения», а не «предиката» или «метки».С другой стороны, он использует Concept в качестве «метки» (термин, который применяется только к узлам).

Если вы спрашиваете, как копировать метки между конкретными узлами, ответчто вы не можете сделать это на самом языке Cypher (если вы не знаете заранее весь набор меток, которые можно использовать).Это связано с тем, что необработанный язык Cypher не поддерживает назначение меток с помощью переменной.

Однако вы можете вызвать процедуру APOC apoc.create.addLabels (после установки плагина APOC) для копированиявсе метки от одного узла к другому.Например, этот запрос копирует все метки из узла c в узел obj:

MATCH (c:Concept)-[:CONTAINS_OBJECT]->(obj)
CALL apoc.create.addLabels(obj, LABELS(c)) YIELD node
RETURN node
0 голосов
/ 12 апреля 2019

Для всех, кто приходит на этот пост с аналогичными требованиями, мы в конечном итоге пришли к следующему запросу, который дал нам именно тот результат, который мы получили:

call apoc.periodic.commit("MATCH (n:Concept)-[:CONTAINS_OBJECT]->(o:Object)
    WITH o, n, replace(n.Name, ' ', '_') as label limit {limit} call
    apoc.create.addLabels(o, [label]) yield node
    with node
    RETURN node",
{limit:100000});

Обратите внимание, что у нас есть <150 узлов, помеченных «Концепцией», и поля «Имя», содержащие пробелы, которые мы заменили подчеркиванием. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...