使用.Net客户端在NEO4J中动态创建节点ID和属性

时间:2013-04-19 05:57:36

标签: .net neo4j

如何动态地使用.Net客户端创建节点及其属性? 有点像这样吗?

  Node node = new Node();
  node.AddProperty("Type", "Domain");

我不想在类中硬编码,即

  JsonProperty***("Bar")]***
  public string Foo { get; set; }

  var myNodeReference = client.Create(new MyNode { Foo = "bar" });

3 个答案:

答案 0 :(得分:2)

在可以从Neo4j.org下载页面下载的Neo4j server v2.0 M06版本中,您可以直接在您的Neo4j服务器中使用Cypher查询中的JSON。

示例:

CREATE 
    (view0:event:view 
     { 
         key:'view0', 
         verb:'view', 
         past:'has viewed', 
         present:'is viewing', 
         future:'will view' 
      })-[:event]->d16

您可以从我的GitHub存储库中获取以下C#类文件,该文件允许您将Cypher查询直接发送到Neo4j服务器:

https://github.com/kbastani/predictive-autocomplete/blob/master/predictive-autocomplete/PredictiveAutocomplete/CypherQueryCreator.cs

您可以通过访问GitHub中的以下C#类文件来查看其用法:

https://github.com/kbastani/predictive-autocomplete/blob/master/predictive-autocomplete/PredictiveAutocomplete/Processor.cs

转到“GetRankedNodesForQuery”,我在这里复制了代码。

public static List<IGraphNode> GetRankedNodesForQuery(string index, string luceneQuery, string relationshipLabel, string labelPropertyName, int skip, int limit)
{
        var sb = new StringBuilder();
        sb.AppendLine("START node=node:{0}(\"{1}\")");
        sb.AppendLine("WITH node");
        sb.AppendLine("SKIP {2}");
        sb.AppendLine("LIMIT {3}");
        sb.AppendLine("WITH node");
        sb.AppendLine("MATCH n-[{4}]->node");
        sb.AppendLine("WITH node, count(distinct n) as size");
        sb.AppendLine("RETURN node.{5}? as label, size");
        sb.AppendLine("ORDER BY id(node)");
        sb.AppendLine("LIMIT {3}");

        string commandQuery = sb.ToString();

        commandQuery = string.Format(commandQuery, index, luceneQuery, skip, limit, !string.IsNullOrEmpty(relationshipLabel) ? string.Format(":{0}", relationshipLabel) : string.Empty, labelPropertyName);

        GraphClient graphClient = GetNeo4jGraphClient();

        var cypher = new CypherFluentQueryCreator(graphClient, new CypherQueryCreator(commandQuery), new Uri(Configuration.GetDatabaseUri()));

        var resulttask = cypher.ExecuteGetCypherResults<GraphNode>();
        var graphNodeResults = resulttask.Result.ToList().Select(gn => (IGraphNode)gn).ToList();
        return graphNodeResults;
}

在其他版本中,您需要创建一个包装器。目前最简单的路线是升级到2.0版本。如果这对您不可行,请告诉我,我将编写.NET C#包装器。

答案 1 :(得分:0)

当我为neo4j尝试了几个可用的.NET客户端时,我发现它们都缺少我的用例。看到这些客户端只是围绕REST API的包装器,直接通过REST与服务器通信要容易得多。在当前的.NET状态下,HTTP和JSON支持非常出色。

通过这种方式,您可以动态构建节点并随意创建它们(node creation via REST)。

答案 2 :(得分:0)

您可以使用Cypher.Net创建动态节点和关系 http://www.nuget.org/packages/CypherNet/

(文档和来源:https://github.com/mtranter/CypherNet

const string NEO_SERVER_URL = "http://localhost:7474/db/data/";
var sessionFactory = Fluently.Configure(NEO_SERVER_URL ).CreateSessionFactory();
var cypherSession = sessionFactory.Create();
var node = cypherSession.CreateNode(new { FirstName = "John", LastName = "Smith"});
dynamic dynamicNode = node;
dynamicNode.SomeProperty = "SomeValue";
dynamicNode.AnotherProperty = 123;
cypherSession.Save(node);