0

SOLR デルタ インポートのように、Neo4j 1.9 で特定の期間内に変更 (作成/更新/削除) されたすべてのノード/関係を取得する方法はありますか?

私が考えることができる 1 つの大雑把な方法は、各ノード/関係のタイムスタンプ プロパティを維持し、それらにインデックスを付けてそれらのノード/関係を取得することです。

START a=node:custom_index("timestamp:[{start_time} TO {end_time}]")
RETURN a;

しかし、問題は、CYPHER を介してノードを変更すると、インデックスが更新されないということです。

4

1 に答える 1

2

残念ながら、Neo4j にはそのような組み込み機能はありません。

問題を一つ一つ解決すること。削除されたノード/関係の場合、タイムスタンプを配置する場所がないため、タイムスタンプを維持することはできません。プロパティにタイムスタンプを付けることもできません。したがって、ノードが変更されたことはわかりますが、その方法はわかりません。

考えられる解決策の 1 つは、TransactionEventHandlers を使用して、発生した変更をどこかに記録することです。次に、a) 記録するものを正確に選択できます。b) Cypher について心配する必要はありません。データベースの更新に使用した方法に関係なく、ログに記録されます。

小さなデモをまとめました。すべての変更を標準出力に記録するだけです。簡単にするために、いくつかのGraphAwareクラス (免責事項: 私は作成者です) を使用していますが、気になる場合は、それらを使用せずに作成することもできます。

リンクが最終的に破損した場合などに備えて、コードの重要な部分を次に示します。

@Test
public void demonstrateLoggingEveryChange() {
    GraphDatabaseService database = new TestGraphDatabaseFactory().newImpermanentDatabase();

    database.registerTransactionEventHandler(new ChangeLogger());

    //perform mutations here
}

private class ChangeLogger extends TransactionEventHandler.Adapter<Void> {

    @Override
    public void afterCommit(TransactionData data, Void state) {
        ImprovedTransactionData improvedData = new LazyTransactionData(data);

        for (Node createdNode : improvedData.getAllCreatedNodes()) {
            System.out.println("Created node " + createdNode.getId()
                    + " with properties: " + new SerializablePropertiesImpl(createdNode).toString());
        }

        for (Node deletedNode : improvedData.getAllDeletedNodes()) {
            System.out.println("Deleted node " + deletedNode.getId()
                    + " with properties: " + new SerializablePropertiesImpl(deletedNode).toString());
        }

        for (Change<Node> changedNode : improvedData.getAllChangedNodes()) {
            System.out.println("Changed node " + changedNode.getCurrent().getId()
                    + " from properties: " + new SerializablePropertiesImpl(changedNode.getPrevious()).toString()
                    + " to properties: " + new SerializablePropertiesImpl(changedNode.getCurrent()).toString());
        }

        for (Relationship createdRelationship : improvedData.getAllCreatedRelationships()) {
            System.out.println("Created relationship " + createdRelationship.getId()
                    + " between nodes " + createdRelationship.getStartNode().getId()
                    + " and " + createdRelationship.getEndNode().getId()
                    + " with properties: " + new SerializablePropertiesImpl(createdRelationship).toString());
        }

        for (Relationship deletedRelationship : improvedData.getAllDeletedRelationships()) {
            System.out.println("Deleted relationship " + deletedRelationship.getId()
                    + " between nodes " + deletedRelationship.getStartNode().getId()
                    + " and " + deletedRelationship.getEndNode().getId()
                    + " with properties: " + new SerializablePropertiesImpl(deletedRelationship).toString());
        }

        for (Change<Relationship> changedRelationship : improvedData.getAllChangedRelationships()) {
            System.out.println("Changed relationship " + changedRelationship.getCurrent().getId()
                    + " between nodes " + changedRelationship.getCurrent().getStartNode().getId()
                    + " and " + changedRelationship.getCurrent().getEndNode().getId()
                    + " from properties: " + new SerializablePropertiesImpl(changedRelationship.getPrevious()).toString()
                    + " to properties: " + new SerializablePropertiesImpl(changedRelationship.getCurrent()).toString());
        }
    }
}    
于 2013-08-12T15:06:18.840 に答える