私はDjangoとneo4jの初心者です。Django 1.4.5、neo4j 1.9.2、および neo4django 0.1.8 を使用しています
個人ノードの NodeModel を作成し、「所有者」および「名前」プロパティでインデックスを作成しました。ここに私のmodels.pyがあります:
from neo4django.db import models as models2
class person_conns(models2.NodeModel):
owner = models2.StringProperty(max_length=30,indexed=True)
name = models2.StringProperty(max_length=30,indexed=True)
gender = models2.StringProperty(max_length=1)
parent = models2.Relationship('self',rel_type='parent_of',related_name='parents')
child = models2.Relationship('self',rel_type='child_of',related_name='children')
def __unicode__(self):
return self.name
Neo4j サーバーに接続する前に、自動インデックス作成を True に設定し、次のように conf/neo4j.properties ファイルにインデックス可能なキーを指定しました。
# Autoindexing
# Enable auto-indexing for nodes, default is false
node_auto_indexing=true
# The node property keys to be auto-indexed, if enabled
node_keys_indexable=owner,name
# Enable auto-indexing for relationships, default is false
relationship_auto_indexing=true
# The relationship property keys to be auto-indexed, if enabled
relationship_keys_indexable=child_of,parent_of
Neo4j: Step by Stepに従って、上記のファイルを更新する自動インデックスを作成し、neo4j サーバーに node_auto_index を手動で作成しました。
以下は、neo4j データベースで django の syndb を実行し、手動で自動インデックスを作成した後に、neo4j サーバーで作成されたインデックスです。
graph-person_conns lucene
{"to_lower_case":"true", "_blueprints:type":"MANUAL","type":"fulltext"}node_auto_index lucene {"_blueprints:type":"MANUAL", "type":"exact"}
https://github.com/scholrly/neo4django/issues/123で提案されているように、connection.cypher(queries) を使用して neo4j データベースにクエリを実行しました
例えば:
listpar = connection.cypher("START no=node(*) RETURN no.owner?, no.name?",raw=True)
上記は、すべてのノードの所有者と名前を正しく返します。しかし、次の場合のように、「数値」または「*」の代わりにインデックス付きプロパティをクエリしようとすると:
listpar = connection.cypher("START no=node:node_auto_index(name='s2') RETURN no.owner?, no.name?",raw=True)
上記は0行です。
listpar = connection.cypher("START no=node:graph-person_conns(name='s2') RETURN no.owner?, no.name?",raw=True)
上記は
例外値:
エラー [400]: 不正な要求です。リクエストの構文が正しくないか、サポートされていないメソッドです。無効なデータが送信されました:(' expected but
-' がグラフの後に見つかりました
graph-person_conns の代わりに name, person_conns などの他の文字列を試しましたが、特定のインデックスが存在しないというエラーが発生するたびに。インデックスを追加するときに間違っていますか?
私のプロジェクトは主に、プロパティに基づいてノードをフィルタリングすることに依存しているため、この部分は非常に重要です。任意のポインタや提案をいただければ幸いです。ありがとうございました。
これは、stackoverflow に関する私の最初の投稿です。そのため、情報が不足していたり、紛らわしい記述がある場合は、しばらくお待ちください. ありがとうございました。
更新: 助けてくれてありがとう。他の人のために、サイファークエリを使用して2つのノード間の最短パスをトラバース/検索する方法の例を挙げたいと思います。
from neo4django.db import connection
results = connection.cypher("START source=node:`graph-person_conns`(person_name='s2sp1'),dest=node:`graph-person_conns`(person_name='s2c1') MATCH p=ShortestPath(source-[*]->dest) RETURN extract(i in nodes(p) : i.person_name), extract(j in rels(p) : type(j))")
これは、グラフ上の s2sp1 と s2c1 という名前のノード間の最短経路を見つけることです。Cypher クエリは非常に優れており、ホップやリレーションの種類などを制限するノードをトラバースするのに役立ちます。
誰かがこの方法のパフォーマンスについてコメントできますか? また、Django から Neo4j にアクセスするための効率的な方法があれば提案してください。ありがとうございました :)