ここで私の問題。個人の Neo4j リストに (一意の識別子を使用して) 挿入し、それらの間の関係を作成します。
その人がすでにNeo4jに存在するかどうかを知り、それを作成/更新する最も効率的な方法は何ですか? Neo4jclient はラベルをサポートしていないため、タイプ情報をノードの属性として保存する方が効率的ですか、それとも同じタイプのすべてのノードをこのタイプの「ルート ノード」にリンクする方がよいでしょうか?
前もって感謝します、
エメリック
ここで私の問題。個人の Neo4j リストに (一意の識別子を使用して) 挿入し、それらの間の関係を作成します。
その人がすでにNeo4jに存在するかどうかを知り、それを作成/更新する最も効率的な方法は何ですか? Neo4jclient はラベルをサポートしていないため、タイプ情報をノードの属性として保存する方が効率的ですか、それとも同じタイプのすべてのノードをこのタイプの「ルート ノード」にリンクする方がよいでしょうか?
前もって感謝します、
エメリック
Neo4jClient は、標準の Cypher を介してラベルをサポートします。(ビルド 1.0.0.602 以降。)
graphClient
.Merge("(p:Person {jim}")
.WithParam("jim", new Person { Name = "Jim" })
.ExecuteWithoutResults();
返却することもできます:
var jimNode = graphClient
.Merge("(p:Person {jim}")
.WithParam("jim", new Person { Name = "Jim" })
.Return(p => p.Node<Person>())
.Results
.Single();
インデックスに追加してインデックス クエリを実行できます。
索引の作成:
if (!client.CheckIndexExists("Persons", IndexFor.Node))
client.CreateIndex("Persons", new IndexConfiguration {Provider = IndexProvider.lucene, Type = IndexType.exact}, IndexFor.Node);
人を追加する (インデックス エントリあり)
var chris = new Person {Name = "Chris", Id = DateTime.Now.Ticks};
client.Create(chris, null, GetIndexEntries(chris));
次GetIndexEntries
のようになります。
private static IEnumerable<IndexEntry> GetIndexEntries(Person person)
{
var indexEntries = new List<IndexEntry>
{
new IndexEntry
{
Name = "Persons",
KeyValues = new List<KeyValuePair<string, object>>
{
new KeyValuePair<string, object>("name", person.Name),
new KeyValuePair<string, object>("id", person.Id)
}
}
};
return indexEntries;
}
次に、インデックスをクエリします。
var indexQuery =
client.Cypher
.Start(new {n = Node.ByIndexLookup("Persons", "name", "Chris")})
.Return<Node<Person>>("n");
var results = indexQuery.Results.ToList();
Console.WriteLine("Found {0} results", results.Count());
foreach (var result in results)
Console.WriteLine(result.Data.Id);