Neo4j TimeTree в весенних данных Neo4j 4.0

Я пытаюсь использовать библиотеку timetree в моем проекте весенних данных neo4j 4.0.0.

Как подробно описано на этой странице, https://github.com/graphaware/neo4j-timetree, я я отредактировал мой файл neo4j.properties, чтобы включить автоматическое присоединение событий, добавить зависимость timetree к моей градации и установить свойство «creationDate» в узле события с типом данных Long. Хотя все выглядит так, как должно быть, он по-прежнему не создает никакого дерева времени.

Вот мой файл neo4j.property:

# Runtime must be enabled like this
com.graphaware.runtime.enabled=true

# A Runtime module that takes care of attaching the events like this (TT is the ID of the module)
com.graphaware.module.TT.1=com.graphaware.module.timetree.module.TimeTreeModuleBootstrapper

# Nodes which represent events and should be attached automatically have to be defined
com.graphaware.module.TT.event=hasLabel('StructureVersionChange'),hasLabel('RuleVersionChange'),hasLabel('FilterVersionChange')

# Optionally, a property on the event nodes that represents the the time (long) at which the event took place must be specified (defaults to "timestamp")
com.graphaware.module.TT.timestamp=creationDate

# Optionally, a resolution can be specified (defaults to DAY)
com.graphaware.module.TT.resolution=SECOND

# Optionally, a time zone can be specified (defaults to UTC)
com.graphaware.module.TT.timezone=CEST

# Optionally, a relationship type with which the events will be attached to the tree can be specified (defaults to AT_TIME)
com.graphaware.module.TT.relationship=CREATED_ON

# autoAttach must be set to true
com.graphaware.module.TT.autoAttach=true

На самом деле, до этого я пытался использовать JAVA API-версию Timetree для своего проекта, но потом меня очень смутил тип параметра конструктора timetree, которым является Node. Принимая во внимание, что весной у моих узлов есть типы своих классов.

Заранее спасибо, и ваше предложение будет действительно оценено!

РЕДАКТИРОВАТЬ:

neo4j.properties

# Runtime must be enabled like this
com.graphaware.runtime.enabled=true

# A Runtime module that takes care of attaching the events like this (TT is the ID of the module)
com.graphaware.module.TT.1=com.graphaware.module.timetree.module.TimeTreeModuleBootstrapper

# Nodes which represent events and should be attached automatically have to be defined
com.graphaware.module.TT.event=hasLabel('FilterVersionChange') || hasLabel('StructureVersionChange') || hasLabel('CodeUnitVersionChange') || hasLabel('RuleVersionChange') || hasLabel('EpisodeVersion')

# Optionally, a property on the event nodes that represents the the time (long) at which the event took place must be specified (defaults to "timestamp")
com.graphaware.module.TT.timestamp=creationDate

# Optionally, a resolution can be specified (defaults to DAY)
com.graphaware.module.TT.resolution=SECOND

# Optionally, a time zone can be specified (defaults to UTC)
com.graphaware.module.TT.timezone=CEST

# Optionally, a relationship type with which the events will be attached to the tree can be specified (defaults to AT_TIME)
com.graphaware.module.TT.relationship=CREATED_ON

# autoAttach must be set to true
com.graphaware.module.TT.autoAttach=true

данные/журнал/neo4j.0.0

May 17, 2015 4:07:42 PM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFO: Initiating Jersey application, version 'Jersey: 1.18.1 02/19/2014 03:28 AM'
May 17, 2015 4:07:42 PM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFO: Initiating Jersey application, version 'Jersey: 1.18.1 02/19/2014 03:28 AM'
May 17, 2015 4:07:43 PM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFO: Initiating Jersey application, version 'Jersey: 1.18.1 02/19/2014 03:28 AM'
May 17, 2015 4:11:39 PM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFO: Initiating Jersey application, version 'Jersey: 1.18.1 02/19/2014 03:28 AM'
May 17, 2015 4:11:39 PM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFO: Initiating Jersey application, version 'Jersey: 1.18.1 02/19/2014 03:28 AM'
May 17, 2015 4:11:39 PM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFO: Initiating Jersey application, version 'Jersey: 1.18.1 02/19/2014 03:28 AM'
May 17, 2015 4:28:49 PM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFO: Initiating Jersey application, version 'Jersey: 1.18.1 02/19/2014 03:28 AM'
May 17, 2015 4:28:49 PM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFO: Initiating Jersey application, version 'Jersey: 1.18.1 02/19/2014 03:28 AM'
May 17, 2015 4:28:49 PM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFO: Initiating Jersey application, version 'Jersey: 1.18.1 02/19/2014 03:28 AM'

данные/graph.db/сообщения

2015-05-17 14:28:46.537+0000 INFO  [o.n.k.i.DiagnosticsManager]: --- INITIALIZED diagnostics START ---
2015-05-17 14:28:46.538+0000 INFO  [o.n.k.i.DiagnosticsManager]: Neo4j Kernel properties:
2015-05-17 14:28:46.541+0000 INFO  [o.n.k.i.DiagnosticsManager]: com.graphaware.module.TT.resolution=DAY
2015-05-17 14:28:46.541+0000 INFO  [o.n.k.i.DiagnosticsManager]: com.graphaware.module.TT.timestamp=creationDate
2015-05-17 14:28:46.541+0000 INFO  [o.n.k.i.DiagnosticsManager]: com.graphaware.module.TT.relationship=CREATED_ON
2015-05-17 14:28:46.541+0000 INFO  [o.n.k.i.DiagnosticsManager]: com.graphaware.module.TT.event=hasLabel('FilterVersionChange') || hasLabel('ArchitectureUnitVersionChange') || hasLabel('CodeUnitVersionChange') || hasLabel('RuleVersionChange') || hasLabel('EpisodeVersion')
2015-05-17 14:28:46.541+0000 INFO  [o.n.k.i.DiagnosticsManager]: store_dir=C:\NEO4J-~1.1\data\graph.db
2015-05-17 14:28:46.541+0000 INFO  [o.n.k.i.DiagnosticsManager]: com.graphaware.runtime.enabled=true
2015-05-17 14:28:46.541+0000 INFO  [o.n.k.i.DiagnosticsManager]: com.graphaware.module.TT.autoAttach=true
2015-05-17 14:28:46.541+0000 INFO  [o.n.k.i.DiagnosticsManager]: remote_shell_enabled=true
2015-05-17 14:28:46.541+0000 INFO  [o.n.k.i.DiagnosticsManager]: com.graphaware.module.TT.timezone=CEST
2015-05-17 14:28:46.541+0000 INFO  [o.n.k.i.DiagnosticsManager]: com.graphaware.module.TT.1=com.graphaware.module.timetree.module.TimeTreeModuleBootstrapper
2015-05-17 14:28:46.544+0000 INFO  [o.n.k.i.DiagnosticsManager]: Diagnostics providers:
2015-05-17 14:28:46.544+0000 INFO  [o.n.k.i.DiagnosticsManager]: org.neo4j.kernel.configuration.Config
...
...
2015-05-17 14:28:48.656+0000 INFO  [o.n.k.i.DiagnosticsManager]: --- STARTED diagnostics for KernelDiagnostics:StoreFiles END ---
2015-05-17 14:28:48.696+0000 INFO  [o.n.k.EmbeddedGraphDatabase]: Database is now ready
2015-05-17 14:28:48.696+0000 INFO  [o.n.s.d.LifecycleManagingDatabase]: Successfully started database
2015-05-17 14:28:48.699+0000 INFO  [o.n.k.i.DiagnosticsManager]: --- SERVER STARTED START ---
2015-05-17 14:28:48.736+0000 INFO  [o.n.s.CommunityNeoServer]: Starting HTTP on port :7474 with 8 threads available
2015-05-17 14:28:48.872+0000 INFO  [o.n.s.CommunityNeoServer]: Enabling HTTPS on port :7473
2015-05-17 14:28:48.989+0000 INFO  [o.n.s.w.Jetty9WebServer]: Mounting static content at [/webadmin] from [webadmin-html]
2015-05-17 14:28:49.023+0000 INFO  [o.n.s.w.Jetty9WebServer]: Mounting static content at [/browser] from [browser]
2015-05-17 14:28:49.956+0000 INFO  [o.n.s.CommunityNeoServer]: Server started on: http://localhost:7474/
2015-05-17 14:28:49.956+0000 INFO  [o.n.s.CommunityNeoServer]: Remote interface ready and available at [http://localhost:7474/]
2015-05-17 14:28:49.956+0000 INFO  [o.n.k.i.DiagnosticsManager]: --- SERVER STARTED END ---

Объект класса

@NodeEntity
public class FilterVersionChange extends UnitVersion {
    @GraphId
    private Long id;

    public FilterVersionChange() {
        super();
    }

    public FilterVersionChange(String description, Date creationDate)
    {
        super(description, creationDate);
    }

    @Relationship(type="CONTAINS", direction = Relationship.OUTGOING)
    private Set<FilterState> filterStates;

    @Relationship(type="PREVIOUS", direction = Relationship.OUTGOING)
    private FilterVersionChange previousFilterVersionChange;

    @Relationship(type="REFERENCES", direction = Relationship.OUTGOING)
    private FilterVersionChange referencedFilterVersionChange;

    @Relationship(type="ADDED", direction = Relationship.OUTGOING)
    private Set<FilterState> newFilterStates;

    @Relationship(type="DELETED", direction = Relationship.OUTGOING)
    private Set<FilterState> deletedFilterStates;

    @Relationship(type="MODIFIED", direction = Relationship.OUTGOING)
    private Set<ModifiedUnitState> modifiedFilterStates;

    public void contains(Set<FilterState> filterStates) {
        this.filterStates = filterStates;
    }

    public void previous(FilterVersionChange previousFilterVersionChange) {
        this.previousFilterVersionChange = previousFilterVersionChange;
    }

    public void references(FilterVersionChange referencedFilterVersionChange) {
        this.referencedFilterVersionChange = referencedFilterVersionChange;
    }

    public void added(Set<FilterState> newFilterStates) {
        this.newFilterStates = newFilterStates;
    }

    public void deleted(Set<FilterState> deletedFilterStates) {
        this.deletedFilterStates = deletedFilterStates;
    }

    public void modified(Set<ModifiedUnitState> modifiedFilterStates) {
        this.modifiedFilterStates = modifiedFilterStates;
    }
}

Репозиторий

@Repository
public interface FilterVersionRepository extends GraphRepository<FilterVersion> {
    @Query("MATCH (project:Project {name:{0}})-[:HAS_FILTER_VERSION]->(filterVersion:FilterVersion {name:{1}}) RETURN filterVersion")
    FilterVersion findFilterVersionByName(String projectName, String filterVersionName);

}

Функция вызывающего абонента

public FilterVersionChange createNewFilterVersionChange(String projectName,
                                                            String filterVersionName,
                                                            String filterVersionChangeDescription,
                                                            Set<FilterState> filterStates)
    {
        FilterVersion filterVersion = filterVersionRepository.findFilterVersionByName(projectName, filterVersionName);
        if(filterVersion != null)
        {
            for(FilterState filterState : filterStates)
            {
                Filter filter = new Filter(filterState.getMatchingString(), filterState.getMatchingType());
                filterState.stateOf(filter);
            }
            Set<FilterVersionChange> filterVersionChanges = new HashSet<FilterVersionChange>();
            FilterVersionChange filterVersionChange = new FilterVersionChange(filterVersionChangeDescription, new Date());
            filterVersionChange.contains(filterStates);
            filterVersionChange.added(filterStates);
            filterVersionChanges.add(filterVersionChange);
            filterVersion.tracks(filterVersionChanges);
            filterVersionRepository.save(filterVersion);
            return filterVersionChange;
        }
        else
        {
            return null;
        }
    }

FilterVersion.класс

@NodeEntity
public class FilterVersion {
    @GraphId
    private Long id;

    private String name;
    private String description;
    private Date creationDate;

    public FilterVersion() {

    }

    public FilterVersion(String name, String description, Date creationDate) {
        this.name = name;
        this.description = description;
        this.creationDate = creationDate;
    }

    @Relationship(type = "TRACKS", direction = Relationship.OUTGOING)
    private Set<FilterVersionChange> filterVersionChanges;

    @Relationship(type = "HAS_FILTER_VERSION", direction = Relationship.INCOMING)
    private Project project;

    public void setName(String name) {
        this.name = name;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public void setCreationDate(Date creationDate) {
        this.creationDate = creationDate;
    }

    public void tracks(Set<FilterVersionChange> filterVersionChanges) {
        this.filterVersionChanges = filterVersionChanges;
    }

    public void belongsTo(Project project) {
        this.project = project;
    }

    public Project getProject() {
        return project;
    }
}

UnitVersion.класс

@NodeEntity
public class UnitVersion {
    @GraphId
    protected Long id;

    private String description;
    private Long creationDate;

    public UnitVersion() {

    }

    public UnitVersion(String description, Date creationDate) {
        this.description = description;
        this.creationDate = creationDate.getTime();
    }

    @Relationship(type = "MAPPED_ON", direction = Relationship.OUTGOING)
    private UnitVersion unitVersion;

    public void setDescription(String description) {
        this.description = description;
    }

    public void setCreationDate(Date creationDate) {
        this.creationDate = creationDate.getTime();
    }

    public void mappedOn(UnitVersion unitVersion) {
        this.unitVersion = unitVersion;
    }
}

person Peter Sie    schedule 17.05.2015    source источник
comment
Как вы установили Neo4j? К сожалению, GraphAware Framework работает только тогда, когда вы устанавливаете Neo4j из архива .zip, а не из установщика .exe. (github.com/graphaware/)   -  person Michal Bachman    schedule 17.05.2015
comment
Я настроил свой Neo4j с помощью установщика .exe. Но я переустановил его с помощью установщика .zip только сейчас, после прочтения вашего комментария, настроил файл neo4j.properties, и он все еще не работает. :(   -  person Peter Sie    schedule 17.05.2015
comment
Не могли бы вы также опубликовать код для класса UnitVersion?   -  person Luanne    schedule 18.05.2015
comment
И класс FilterVersion тоже, пожалуйста   -  person Luanne    schedule 18.05.2015
comment
Привет @Luanne, я отредактировал свой пост.   -  person Peter Sie    schedule 18.05.2015
comment
Как ты это делаешь? Запустив приложение на работающем сервере Neo4j, настроенном с помощью плагинов GraphAware, или с помощью теста?   -  person Luanne    schedule 18.05.2015
comment
@Luanne Не через тест. Я просто запускаю это приложение на работающем сервере Neo4j. Но я не уверен в плагине GraphAware, о котором вы говорите. Нужно ли мне что-то настраивать на моем сервере Neo4j?   -  person Peter Sie    schedule 18.05.2015
comment
Да, помещая это в ответ :)   -  person Luanne    schedule 18.05.2015


Ответы (2)


Зависимость полезна только в том случае, если вы используете дерево времени программно. Если ваше приложение работает на сервере Neo4j, вам необходимо загрузить и сохранить в каталог плагинов вашего сервера Neo4j:

а) Платформа GraphAware (выберите Community или Enterprise)

б) Модуль TimeTree

Оба можно загрузить с http://graphaware.com/products/.

Без этого, даже с настройкой в ​​neo4j.properties, GraphAware Runtime не запускается и timetree работать не будет.

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

 GraphAwareRuntime runtime = GraphAwareRuntimeFactory.createRuntime(getDatabase());
        runtime.registerModule(new TimeTreeModule("timetree",
                TimeTreeConfiguration
                        .defaultConfiguration()
                        .with(new NodeInclusionPolicy() {
                            @Override
                            public boolean include(Node node) {
                                return node.hasLabel(DynamicLabel.label("User"));
                            }
                        })

                        })
                        .withRelationshipType(DynamicRelationshipType.withName("CREATED_ON"))
                        .withTimeZone(DateTimeZone.forTimeZone(TimeZone.getTimeZone("GMT+1")))
                        .withTimestampProperty("createdOn")
                        .withResolution(Resolution.DAY)
                ,
                getDatabase()));
        runtime.start();

Затем вы можете написать тесты, такие как

 @Test
    public void shouldSaveUser()
    {
        User user = new User( "Michal" );
        user.setCreatedOn(1431937636995l);
        userRepository.save( user );

        assertSameGraph( getDatabase(), "CREATE (u:User:Person {name:'Michal', createdOn:1431937636995})," +
                "(root:TimeTreeRoot)," +
                        "(root)-[:FIRST]->(year:Year {value:2015})," +
                        "(root)-[:CHILD]->(year)," +
                        "(root)-[:LAST]->(year)," +
                        "(year)-[:FIRST]->(month:Month {value:5})," +
                        "(year)-[:CHILD]->(month)," +
                        "(year)-[:LAST]->(month)," +
                        "(month)-[:FIRST]->(day:Day {value:18})," +
                        "(month)-[:CHILD]->(day)," +
                        "(month)-[:LAST]->(day)," +
                        "(day)<-[:CREATED_ON]-(u)"
        );

    }
person Luanne    schedule 18.05.2015
comment
Бва... Большое спасибо, @Luanne! :) Это решает мою проблему. - person Peter Sie; 18.05.2015
comment
Поддерживает ли этот механизм автоматического присоединения несколько графиков временного дерева в одной базе данных? В моем случае мне нужно более одного дерева времени. - person Peter Sie; 18.05.2015
comment
У меня такая же проблема, я не могу заставить плагин TimeTree что-либо делать. Точно так же я - использую Windows 8.1 - использую Neo4J Community 2.2.2 - я помещаю файлы graphaware-server-community-all-2.2.2.31.jar и graphaware-timetree-2.2.2.31.22.jar в папку плагинов - Я настраиваю свой файл neo4j.property, аналогичный OP, пытаясь использовать функцию autoAttach, сопоставляя определенную метку (узлы, которые я хочу сопоставить, имеют 2 метки, но я использую только одну в конфигурации TimeTree) - я используя приложение .net для отправки запросов в Neo4J. У меня нет корневого узла или узлов времени. Какие-либо предложения? - person Joe; 04.06.2015
comment
Имеет ли создаваемый вами узел правильное свойство временной метки (длинное)? Пожалуйста, рассмотрите возможность открытия еще одного вопроса с вашей конфигурацией и т. Д. - person Luanne; 04.06.2015
comment
Спасибо за ответ, тип данных моего свойства временной метки был неправильным, это была строка, а не длинная. После исправления плагин TimeTree начал создавать узлы. - person Joe; 07.06.2015

Определение возможных меток для TimeTree имеет немного другой синтаксис, как описано в документации InclusionPolicy https://github.com/graphaware/neo4j-framework/tree/master/common#inclusion-policies

Синтаксис следующий:

com.graphaware.module.TT.event=hasLabel('StructureVersionChange')||hasLabel('RuleVersionChange')||hasLabel('FilterVersionChange')

В целях отладки вы можете добавить следующие строки в файл conf/custom-logback.xml:

<appender name="EXTENSIONLOG"  class="ch.qos.logback.core.FileAppender">
  <file>data/log/extensions.log</file>
  <encoder>
      <pattern>%date{yyyy-MM-dd HH:mm:ss.SSSZ} %-5level [%logger{15}]: %message%n</pattern>
  </encoder>
</appender>

<logger name="com.graphaware" level="debug">
  <appender-ref ref="EXTENSIONLOG"/>
</logger>

и просмотрите файл extensions.log

person Christophe Willemsen    schedule 17.05.2015
comment
Спасибо, что указали на это! Но я не знаю, почему это все еще не работает. Тем не менее, здесь не создаются узлы временного дерева. Есть ли что-то, что я пропустил, кроме: добавление зависимости временного дерева, настройка этого файла свойств и предоставление свойства времени на узле событий с типом Long? - person Peter Sie; 17.05.2015
comment
есть ли у вас вывод в файле data/log/console.log и data/graph.db/messages.log? - person Christophe Willemsen; 17.05.2015
comment
также вы можете вставить код, который вы используете, который должен запускать дерево времени. - person Christophe Willemsen; 17.05.2015
comment
Я отредактировал свой пост. Кажется, я не могу найти файл console.log. В моем каталоге db есть только файл сообщений. Я создаю свои узлы событий, как обычно. Я ожидаю, что эта система автоматического подключения не требует дополнительного кода на стороне программирования. - person Peter Sie; 17.05.2015
comment
console.log находится в разделе data/log - person Christophe Willemsen; 17.05.2015
comment
Извините, но прямо под моим каталогом db есть только 3 каталога: dbms, index и schema. Здесь нет ни данных, ни каталога журналов. - person Peter Sie; 17.05.2015
comment
ты на винде работаешь? - person Christophe Willemsen; 17.05.2015
comment
Я думаю, комментарий @MichalBachman к вашему вопросу проясняет ситуацию - person Christophe Willemsen; 17.05.2015
comment
Да, я только что переустановил свой Neo4j с помощью установщика .zip, и, к сожалению, он все еще не работает. Я использую Neo4j 2.2.1 - person Peter Sie; 17.05.2015
comment
Хорошо, тогда, возможно, нам понадобится ваш полный код, то есть ваши сущности, репозиторий, пожалуйста, добавьте конфигурацию ведения журнала и полный вывод ваших журналов теперь, когда neo4j установлен другим способом, у вас должны быть каталоги журналов. - person Christophe Willemsen; 17.05.2015
comment
Я отредактировал свой пост. Файл сообщений слишком большой, я просто включаю начало инициализации и некоторые последние записи. - person Peter Sie; 17.05.2015
comment
да, он может быть слишком большим, однако файл console.log отсутствует, у вас должен быть console.log со строками типа 15:31:22.447 [main] INFO cgsGraphAwareEnterpriseNeoServer — сервер запущен: localhost:7474 15:31:22.447 [main] INFO cgsGraphAwareEnterpriseNeoServer — Удаленный интерфейс готов и доступен по адресу [localhost:7474/] после завершения запуска БД - person Christophe Willemsen; 17.05.2015
comment
В моих данных/журнале нет файла console.log. Есть только: расширения, neo4j.0.0, neo4j.0.0.log.lck и README. - person Peter Sie; 17.05.2015
comment
у вас есть что-то в %APPDATA%\Neo4j Community\logs? - person Christophe Willemsen; 17.05.2015
comment
Нет, в папке AppData нет папки Neo4j. - person Peter Sie; 17.05.2015
comment
Хорошо ли сохраняются данные в Neo4j, я имею в виду, что все они имеют правильные метки и свойство createDate, как указано в конфигурации? - person Christophe Willemsen; 17.05.2015
comment
Да, узел события имеет 2 метки (1 из них — FilterVersionChange) и имеет свойство createDate со значением типа Long. Метка: FilterVersionChange UnitVersion; Дата создания: 1431874594403; description:Описание некоторых изменений фильтра - person Peter Sie; 17.05.2015