2015-11-08 4 views
2

Я совершенно не знаком с Neo4j. Я тестирую базу данных графа, и у меня есть следующая простая тестовая структура графика: different labeled nodes with properties, which are connected.Сравнение свойств узлов Neo4j во время обхода

Все узлы имеют свойство, которое называется доступом. Это список строковых элементов, таких как:

{access: ['http', 'www']} 

Я искал решение, где я получаю все узлы из исходного узла, которые соединены (не имеет значения, какой тип или направление), и их отношения где существует пересечение на свойстве доступа узлов. Я начну с заданного узла и сравню свойство доступа со следующим подключенным узлом. Затем возьмите свойство второго узла и сравните это свойство доступа с узлами, которые связаны с ними. И так далее. Целью должны быть все узлы и их соединения, в которых существует интеллект по свойству доступа. Например, на конкретной структуре графика мы начинаем с узла ENC 2009 и должны проходить все подключенные узлы до тех пор, пока не будет достигнут узел без пересечения в свойстве доступа. В этом примере должна быть достигнута следующая цель: traversed graph

Я пробовал следующий запрос cypher, но он не работает нормально на каждом узле в качестве стартового узла.

MATCH (n:CONFERENCE_SERIE) WHERE n.full_name =~ 'mex.*' 
MATCH p = n-[*]-m WHERE FILTER(x IN n.access WHERE x IN m.access) 
RETURN p 

Есть ли решение, с рамками обхода Java или с шифром, чтобы достичь цели и получить путь такого графа?

Заранее за вашу помощь.

рамки обхода
+0

Вы ищете пути, где ** ** все узлы имеют по крайней мере один 'access' собственности в общем? Или вы ищете пересечение на каждом отдельном шаге, т. Е. Первый и последний узел не нуждаются в перекрестке? Значит ли размер пересечения? –

+0

Я ищу перекресток на каждом отдельном шаге.Так, например, что конкретная серия конференций может иметь доступ к экземплярам конференции и представленному документу, но не к автору, который написал статью или журнал. Размер пересечения не имеет значения. По меньшей мере одно совпадение элемента в списке доступа означает, что этот узел имеет доступ и может быть добавлен к пути. –

ответ

1

Явы будет более эффективной в этом, вы должны использовать отношения текущего пути в вашем RelationshipExpander

http://neo4j.com/docs/stable/tutorial-traversal-java-api.html#_pathexpander_relationshipexpander

В шифроме вы могли бы сделать что-то вроде:

MATCH (n:CONFERENCE_SERIE) WHERE n.full_name =~ 'mex.*' 
MATCH p = n-[*]-m 
WHERE FILTER(idx IN range(0,length(p)-2) 
     WHERE ANY(access IN (rels(p)[idx]).access 
       WHERE access IN (rels(p)[idx+1]).access)) 
RETURN p 

т. Е. Иметь счетчик от 0 до path-len-2 посмотреть на каждую пару отводов пути и проверить, что по крайней мере один (ЛЮБЫЙ) код доступа содержится в свойствах доступа next rel ,

+0

Я пробовал ваш следующий пример cypher, но, к сожалению, он не работает. Для пути скалярная функция size() не работает. Я думаю, что я должен использовать вместо size() функцию length(). Если я заменил функцию length() и запустил этот запрос, я не получил пути назад. Как можно сравнить два узла с RelationshipExpander? Возможно ли доступ к связанным узлам? –

+0

В интерфейсе-расширителе вы получаете пройденный путь, который имеет все узлы и отношения текущего расширения. –

1

ОК, я нашел решение, которое работает для меня. @MichaelHunger, спасибо за ваши намеки. Надеюсь, что мой коллега, который работает с графикой, отлично подходит. Мы увидим это завтра.

Только для информации: в обходОписание, я создал Оценщика. Я взял последние отношения из пути и передал доступ к свойствам с начала и конца узла. Теперь я могу сравнить, есть ли пересечение между обоими свойствами. Если это так, я включаю узел в результат и продолжаю. Если нет, исключите узел и остановите обход. Это работает, и я надеюсь, что это эффективное решение.

Исходный код выглядит следующим образом:

 TraversalDescription traversal = db.traversalDescription().depthFirst().evaluator(new Evaluator() { 
     @Override 
     public Evaluation evaluate(Path path) { 
      // TODO Auto-generated method stub 
      if (path.length() != 0) { 
       String[] startAccess = (String[]) path.lastRelationship().getStartNode().getProperty("access"); 
       String[] endAccess = (String[]) path.lastRelationship().getEndNode().getProperty("access"); 

       if (checkInteresection(startAccess, endAccess)) { 
        return Evaluation.INCLUDE_AND_CONTINUE; 
       } else { 
        return Evaluation.EXCLUDE_AND_PRUNE; 
       } 
      } 
      return Evaluation.INCLUDE_AND_CONTINUE; 
     } 
+0

Действительно хорошее решение! –

Смежные вопросы