Neo4jClient测试节点是否存在,获取NodeReference或创建的最佳方法

本文关键字:创建 最佳 方法 NodeReference 获取 节点 测试 是否 存在 Neo4jClient | 更新日期: 2023-09-27 18:34:28

这是我的问题。我在我的Neo4j人员列表中插入(带有唯一标识符(并在他们之间建立关系。

知道这个人是否已经存在于Neo4j中,然后创建/更新它的最有效方法是什么?既然 Neo4jclient 不支持标签,是将类型信息存储为节点的属性更有效率,还是将所有同类型的节点链接到这种类型的"根节点"更好?

提前谢谢你,

埃默里克

Neo4jClient测试节点是否存在,获取NodeReference或创建的最佳方法

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);