2015-09-23 5 views
1

Похоже, что я не могу добавить отношения, если в некоторых объектах, которые подчиняются этим отношениям, уже нет данных. Это верно? Я хочу сначала настроить мои отношения и ярлыки, а затем заполнить данные и использовать данные только для отношений.Добавить отношения без данных уже в базе данных

Я использую:

MATCH (from:this_label),(to:that_label) 
WHERE from.id = to.uuid 
CREATE (from)-[:hasARelationship]->(to); 

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

+0

Что означает, что Существа подчиняются отношениям? «Узел-тип» означает узел с меткой? – jjaderberg

+0

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

+0

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

ответ

1

Это может быть полезно различать обязанности исполняющих ограничение и выполняет ограничение.

Neo4j позволяет индексы и ограничения, связанные с метками. Индексы и ограничения, созданные для метки, используются для индексации и ограничения узлов, имеющих эту метку. Начиная с version 2.2.5 существует только один тип ограничений: ограничение единственности для одного свойства. Были разговоры о добавлении ограничений для комбинаций свойств и для отношений, но я не знаю статуса этих разговоров.

Ограничения схемы Neo4j соблюдение что-то, но они не будут выполнять , в смысле изменения ваших операций в базе данных, чтобы удовлетворять ограничению. Если бы были ограничения, обеспечивающие, что узел с меткой A может быть создан только в том случае, если он имеет отношение типа R к узлу с меткой B, они блокировали бы вашу операцию, если бы она не удовлетворяла этому ограничению, но они не удовлетворяли бы ее для вы.

Наилучший способ достижения этого: a) удовлетворить это требование в клиентском приложении или b) создать расширение для Neo4j. Для примера расширения рассмотрите neo4j-uuid от Stefan Armbruster.Он прослушивает транзакции (используя то, что называется TransactionEventListener), и гарантирует, что любой узел, созданный в базе данных, имеет UUID. Это расширение удовлетворяет, что может быть только принудительным с помощью соответствующего ограничения схемы Neo4j (существуют и другие отличия, например ограничение ограничивается областью метки).

Способ достижения вашего намерения может состоять в том, чтобы либо создать расширение, которое прослушивает то, что вы пишете в базу данных, и удовлетворяет вашему ограничению, изменяя при необходимости свои операции; или тот, который обеспечивает целевую задачу вызова на сервере (конечную точку RESTful), которую вы можете вызывать, когда хотите создать узел с определенной меткой. Затем расширение создаст узел и другие элементы, необходимые для выполнения вашей схемы. Недостатком первого может быть накладные расходы на прослушивание всех ваших операций, недостатком последнего может быть то, что он прерывает ваш поток взаимодействия с базой данных, чтобы ввести отдельный тип вызова (например, если вы обычно выполняете операторы cypher и должны приостановить выпуск отдельного запроса POST и интерпретировать ответ до продолжения).

1

Если вы правильно поняли, вы хотите использовать MERGE вместо MATCH.

MERGE (from:this_label) -[:hasARelationship]-> (to:that_label) WHERE from.id = to.uuid 

Если вы пытаетесь создать отношения без узлов, я предполагаю, что это невозможно даже в NEO4J. Infact, это было бы невозможно на любом графике вообще.

+0

предложение WHERE вызывает перерыв .... – Zuriar

+0

So ?? Извините, но чего именно вы хотите достичь? – hspandher

+0

Я хочу, чтобы сначала можно было установить отношения, а затем, когда создаются узлы, соответствующие их отношениям. На данный момент я не могу – Zuriar

1

Не имеет смысла предварительно заполнять вашу БД отношениями, которые соединяются с фиктивными узлами. Среди многих причин, таковы:

  • Вы не могли бы сделать какие-либо значимые запросы с участием таких отношений
  • Пытаясь заполнить фиктивные узлы позже с фактическими данными, может быть сложной задачей
  • It очень легко создавать отношения, когда они необходимы. neo4j - это «схематическая» БД (за исключением случаев, когда вы определяете ограничения уникальности, как упоминает @jjaderberg). Вы можете создать связь любого типа, соединяющего узлы с любыми метками (или без меток) в любое время. Чтобы все было организовано, вы можете написать свой код клиента БД и запросы Cypher, чтобы он соответствовал вашей собственной концептуальной «схеме», но у neo4j нет такого требования.
+0

спасибо, так как же установить схему, чтобы заставить узлы определенного типа иметь отношения с другими узлами? – Zuriar

+0

neo4j - это «схематическая» БД. Нет предустановленной схемы. Вы можете создать связь любого типа, соединяющего узлы с любыми метками (или без меток) в любое время. Вы можете навязать свою собственную «схему», написав свой код, как если бы он был один, но neo4j не налагает такого требования. – cybersam

+0

Я обновил свой ответ, чтобы включить эту информацию. – cybersam