2016-04-11 12 views
1

私は、triplestoreとデータベースロジック間の変換を処理するためにrdflib-sqlalchemyを使用してDjangoベースの意味論的アプリケーションを構築中です。問題がrdflib-sqlalchemyであるかRDFLib自体であるかは実際には分かりませんが、Djangoアプリケーションからトリプルを削除しようとすると、データベースのトリプル部分には何の影響もなく、グラフは同じ結果を返します削除試行前後のトリプル数。同じ手順をPythonコンソール(同じVirtualEnv、同じ基本データだが異なるデータベース)から試してみると、graph.remove()関数は期待通りに機能します。私はSOにこれほどよく似ていることは何も見ませんが、私は何か不足している可能性があります。RDFLibまたはrdflib-sqlalchemy:graph.remove関数が黙って失敗する

ので、例えば、対象としてhttps://url.to/scheme/MADAGASCARですべてのトリプルを削除する手段として、次のような作品:

>>> g 
<Graph identifier=foo (<class 'rdflib.graph.ConjunctiveGraph'>)> 
>>> g.store 
<Partitioned SQL N3 Store> 
>>> len(list(g.triples(('https://url.to/scheme/MADAGASCAR',None,None)))) 
11 
>>> g.remove(('https://url.to/scheme/MADAGASCAR',None,None)) 
>>> len(list(g.triples(('https://url.to/scheme/MADAGASCAR',None,None)))) 
0 

同様に、私は私のジャンゴインタラクティブコンソール内から同じメソッドを使用することができます。

>>> from django.conf import settings 
>>> from rdflib_sqlalchemy.SQLAlchemy import SQLAlchemy 
>>> from semantic.models import Namespace, AssertionStatement, LiteralStatement, QuotedStatement, TypeStatement, Resource 
>>> g = settings.GRAPH 
>>> len(list(g.triples(('https://url.to/scheme/MADAGASCAR',None,None)))) 
11 
>>> g.remove(('https://url.to/scheme/MADAGASCAR',None,None)) 
>>> len(list(g.triples(('https://url.to/scheme/MADAGASCAR',None,None)))) 
0 

しかし、信号内から呼び出すと効果はありません。私がシグナルコードを投稿する前に、事実上複合キー(Djangoがサポートしていないもの)であるトリプルを管理する私のアプローチを簡単に説明しましょう。私が行ったことは、リソース(例えば、owl:NamedIndividual、述語もリテラルもない)とrdflib-sqlalchemyのデータベーステーブルにマップされた5つのアンマネージドモデルをリストする単一のDjango管理モデルを作成することですid(pk)フィールドは4997年現在)。管理コマンドを使用してストアにデータを移入するには、rdflib-sqlalchemyを使用してデータを適切な非管理テーブルに格納します。その後、TypeStatementsを繰り返し処理して、管理対象のResourceテーブルに移入するユニークなリソースセットを取得します。これにより、管理インタフェースの一部が駆動され、複合キーのサポートが不足している場合の回避策として、リソースを統一的に管理することが可能になります。

ここでは、管理インターフェースのすべてがリストの目的で動作します。だから私はカスケード削除を模倣するdelete関数を追加して、Resourceオブジェクトを削除するとそのリソースを持つすべてのトリプルをサブジェクトとして削除し、そのリソースを持つすべてのトリプルをオブジェクトとして削除したいと考えました。オブジェクトの削除機能に追加された関数をどのように挿入するのかに関する私の研究は、私をSignalsに導いた。以下は、リソースオブジェクトのpre_deleteのために作成したシグナルです。デバッグに役立つようにコンソールログを追加しました。その出力も後に続く。

from django.db.models.signals import pre_save, pre_delete, post_save, post_delete 
from django.dispatch import receiver 
from django.conf import settings 
from semantic.models import Namespace, AssertionStatement, LiteralStatement, QuotedStatement, TypeStatement, Resource 
from rdflib_sqlalchemy.SQLAlchemy import SQLAlchemy 
from rdflib import ConjunctiveGraph, URIRef 

graph = settings.GRAPH 

# When something is deleted from the Resource table, we want to delete all of its associated inbound and outbound triples 
@receiver(pre_delete, sender=Resource) 
def model_pre_change(sender, **kwargs): 
    print("Before delete, the graph has %s triples" % len(graph)) 
    print("There are %s " % len(list(graph.triples((kwargs['instance'].__str__(),None,None)))) + "triples associated with %s " % kwargs['instance'].__str__()) 

    # Not sure why graph.remove(triple_or_quad) doesn't seem to work... 
    graph.remove((kwargs['instance'].__str__(),None,None)) 
    graph.remove((None,None,kwargs['instance'].__str__())) 


@receiver(post_delete, sender=Resource) 
def model_post_change(sender, **kwargs): 
    # This is for debugging only. 
    print("After delete, the graph has %s triples" % len(graph)) 
    print("There are %s " % len(list(graph.triples((kwargs['instance'].__str__(),None,None)))) + "triples associated with %s " % kwargs['instance'].__str__()) 

、ログ出力:

Before delete, the graph has 2178 triples 
There are 11 triples associated with https://url.to/scheme/MADAGASCAR 
After delete, the graph has 2178 triples 
There are 11 triples associated with https://url.to/scheme/MADAGASCAR 

予想通りリソース・モデルのオブジェクトが削除されますが、トリプルは店に残っています。

したがって、どうすれば実際に動作させることができますか?信号に何か間違っているのですか?

答えて

0

私はそれが重要だとは思わなかったが、自分のデータベースにsqliteを使っていた。エラーメッセージが表示されず、Django wsgiの実行中にデータベースがロックされることはありませんでした。これはDjangoの対話型コンソールの下では起こりそうにないので、機能は問題なく動作しています。

とにかく私はPostgreSQLに切り替えました。ロジックはexpecetdとして動作します。私のセットアップは、データベースへの複数の同時接続に依存していると思います。これは、rdflib-sqlalchemyが単にストアを読み取る限りです。

関連する問題