2

現在、Neo4j TimeTree REST API を使用していますが、特定のタイムスタンプの前後の時間に移動する方法はありますか? 私の解決策は秒であり、分が変更された場合、前の分の前の秒を現在の秒に橋渡しする「次の」関係がないことを認識しています。これにより、サイファークエリが非常に複雑になり、車輪が既に利用可能になっている場合、車輪を再発明したくありません. 事前に感謝し、あなたの応答は本当に高く評価されます!

編集

下の図でわかるように、欠落している NEXT 関係の問題をもう一度再現する必要があります。これは、新しい Second time インスタントを追加する 3 回目から発生し始めます。

ここに画像の説明を入力

実際に、2 番目のノードで動作する NodeEntity を作成します。クラスは以下のようなものです。

@NodeEntity(label = "Second")
public class TimeTreeSecond {
    @GraphId
    private Long id;

    private Integer value;

    @Relationship(type = "CREATED_ON", direction = Relationship.INCOMING)
    private FilterVersionChange relatedFilterVersionChange;

    @Relationship(type = "NEXT", direction = Relationship.OUTGOING)
    private TimeTreeSecond nextTimeTreeSecond;

    @Relationship(type = "NEXT", direction = Relationship.INCOMING)
    private TimeTreeSecond prevTimeTreeSecond;

    public TimeTreeSecond() {
    }

    public Long getId() {
        return id;
    }

    public void next(TimeTreeSecond nextTimeTreeSecond) {
        this.nextTimeTreeSecond = nextTimeTreeSecond;
    }

    public FilterVersionChange getRelatedFilterVersionChange() {
        return relatedFilterVersionChange;
    }
}

ここでの問題は、着信 NEXT 関係です。それを省略すると、すべて正常に動作します。短い遅延で繰り返し時刻を作成すると、コンソールでこの種の例外が発生することもあります。

Exception in thread "main" org.neo4j.ogm.session.result.ResultProcessingException: Could not initialise response
    at org.neo4j.ogm.session.response.GraphModelResponse.<init>(GraphModelResponse.java:38)
    at org.neo4j.ogm.session.request.SessionRequestHandler.execute(SessionRequestHandler.java:55)
    at org.neo4j.ogm.session.Neo4jSession.load(Neo4jSession.java:108)
    at org.neo4j.ogm.session.Neo4jSession.load(Neo4jSession.java:100)
    at org.springframework.data.neo4j.repository.GraphRepositoryImpl.findOne(GraphRepositoryImpl.java:50)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:452)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:437)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:409)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
    at com.sun.proxy.$Proxy32.findOne(Unknown Source)
    at de.rwthaachen.service.core.FilterDefinitionServiceImpl.createNewFilterVersionChange(FilterDefinitionServiceImpl.java:100)
    at sampleapp.FilterLauncher.main(FilterLauncher.java:50)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: org.neo4j.ogm.session.result.ResultProcessingException: "errors":[{"code":"Neo.ClientError.Statement.InvalidType","message":"Expected a numeric value for empty iterator, but got null"}]}
    at org.neo4j.ogm.session.response.JsonResponse.parseErrors(JsonResponse.java:128)
    at org.neo4j.ogm.session.response.JsonResponse.parseColumns(JsonResponse.java:102)
    at org.neo4j.ogm.session.response.JsonResponse.initialiseScan(JsonResponse.java:46)
    at org.neo4j.ogm.session.response.GraphModelResponse.initialiseScan(GraphModelResponse.java:66)
    at org.neo4j.ogm.session.response.GraphModelResponse.<init>(GraphModelResponse.java:36)
    ... 27 more
2015-05-23 01:30:46,204  INFO ork.data.neo4j.config.Neo4jConfiguration:  62 - Intercepted exception

以下は、タイム インスタント ノードを作成するために使用する REST 呼び出しの例 です。

データの作成に使用する方法:

public FilterVersionChange createNewFilterVersionChange(String projectName,
                                                            String filterVersionName,
                                                            String filterVersionChangeDescription,
                                                            Set<FilterState> filterStates)
    {
        Long filterVersionNodeId = filterVersionRepository.findFilterVersionByName(projectName, filterVersionName);
        FilterVersion newFilterVersion = filterVersionRepository.findOne(filterVersionNodeId, 2);

        // Populate all the existing filters in the current project
        Map<String, Filter> existingFilters = new HashMap<String, Filter>();
        try
        {
            for(Filter filter : newFilterVersion.getProject().getFilters())
            {
                existingFilters.put(filter.getMatchingString(), filter);
            }
        }
        catch(Exception e) {}

        // Map the filter states to the populated filters, if any. Otherwise, create new filter for it.
        for(FilterState filterState : filterStates)
        {
            Filter filter = existingFilters.get(filterState.getMatchingString());
            if(filter == null)
            {
                filter = new Filter(filterState.getMatchingString(), filterState.getMatchingType(), newFilterVersion.getProject());
            }
            filterState.stateOf(filter);
        }

        Long now = System.currentTimeMillis();
        TimeTreeSecond timeInstantNode = timeTreeSecondRepository.findOne(timeTreeService.getFilterTimeInstantNodeId(projectName, now));
        FilterVersionChange filterVersionChange = new FilterVersionChange(filterVersionChangeDescription, now, filterStates, filterStates, newFilterVersion, timeInstantNode);
        FilterVersionChange addedFilterVersionChange = filterVersionChangeRepository.save(filterVersionChange);

        return addedFilterVersionChange;
    }
4

2 に答える 2

4

秒は、分を超えても NEXT 関係を介して互いにリンクされます。

これがあなたの意図したものであることを願っています ここに画像の説明を入力

于 2015-05-22T13:36:54.477 に答える
4

TimeTree の特定の使用法はさておき、SDN 4 を使用して双方向リンク リストを一般的に管理する方法について説明したいと思います。

(post:Post)-[:NEXT]->(post:Post)

できないこと

マッピング フレームワークの制限により、オブジェクト モデルで同じリレーションシップ タイプを 2 つの異なる方向で 2 回確実に宣言することはできません。つまり、これは (現在) 機能しません。

class Post {
   @Relationship(type="NEXT", direction=Relationship.OUTGOING)
   Post next;

   @Relationship(type="NEXT", direction=Relationship.INCOMING)
   Post previous;
}

できること

代わりに、@Transient アノテーションとアノテーション付きセッター メソッドを組み合わせて、目的の結果を得ることができます。

class Post {
   Post next;

   @Transient Post previous;

   @Relationship(type="NEXT", direction=Relationship.OUTGOING)
   public void setNext(Post next) {
      this.next = next;
      if (next != null) {
          next.previous = this;
      }
   }
}

最後のポイントとして、データベースから継続的に再フェッチすることなく、任意の開始ポストからポストのリスト全体を前後にナビゲートできるようにしたい場合は、ロード時にフェッチの深さを -1 に設定できます。投稿、例:

findOne(post.getId(), -1);

無限深度クエリは、一致したオブジェクトからグラフ内の到達可能なすべてのオブジェクトをフェッチすることに注意してください。そのため、注意して使用してください。

これが役立つことを願っています

于 2015-05-24T08:17:29.820 に答える