在Neo4jClient

如何解决在Neo4jClient

我在密码中有以下查询

Match(n1: Red)
Where n1.Id = "someId"
Call apoc.path.subgraphAll(n1,{ minLevel: 0,maxLevel: 100,relationshipFilter: "link",labelFilter: "+Red|Blue"})
Yield nodes,relationships
Return nodes,relationships

我查询的图形大致具有“红色->蓝色->红色”的结构,其中所有边的类型均为“链接”。

查询在浏览器客户端中产生预期的结果。

我的C#看起来像这样:

string subgraphAll = "apoc.path.subgraphAll";
object optionsObj = new {
                minLevel = 0,maxLevel = 100,relationshipFilter = $"{link}",labelFilter = $"+{Red}|{Blue}",beginSequenceAtStart = "true",bfs = true,filterStartNode = false,limit = -1,//endNodes = null,//terminatorNodes = null,//whitelistNodes = null,//blacklistNodes = null,};
 string options = JObject.FromObject(optionsObj).ToString();

 var query = client.Cypher
     .Match($"(n1:{"Red"})")
     .Where((Red n1) => n1.Id == "someId")
     .Call($"{subgraphAll}(n1,{options})")
     .Yield($"nodes,relationships")
     //FigureOut what to do
     .Return<Object>("");
     var result = query.ResultsAsync.Result;

我的问题是:如何使用Neo4J客户端在C#中编写该代码,以及如何在末尾获得类型安全列表(类似List<Red>,List<Blue>,List<Relationship>)。 由于红色和蓝色是C#中的不同类型,因此我看不到如何从查询中反序列化混合的“节点”列表。

请注意,我的示例有些简化。 Nodetypes不是字符串,而是来自我的应用程序中的Enums,以一种安全的方式知道存在哪些节点类型,并且这些类型背后有真实的模型。

我试图突破存储过程的整个参数化,但是代码未经测试,我不知道是否有更好的解决方案。如果有更好的方法,请也提供建议。

我是cypher的新手,所以在这里我需要一些帮助。

我的想法是将节点列表分为两个列表(红色列表和蓝色列表),然后将三个列表输出为匿名对象的属性(如示例中所示)。不幸的是,我的密码还不足以解决它,并且同时转换为c#语法也无济于事。

我主要担心的是,一旦我将其反序列化为一系列未类型化的对象,将它们解析回我的模型中将是一件令人头疼的事。因此,我希望查询能够为我进行整理。

解决方法

在我看来,如果您想沿着将输出解析为Red/Blue类的路线,那么在C#中进行的操作将比在Cypher中进行。 / p>

不幸的是,在这种情况下-我认为使用Neo4j.Driver驱动程序而不是Neo4jClient执行查询会更容易-这是因为目前看来Neo4jClient要删除id(等)属性,您将需要正确地重建图形。

通过4.0.3的客户端,您可以通过以下方式访问Driver

((BoltGraphClient)client).Driver

我使用了一个“电影/人”示例,因为它是我必须处理的数据集,但是原理是相同的,例如:

var queryStr = @"
    Match(n1: Movie)
    Where n1.title = 'The Matrix'
    Call apoc.path.subgraphAll(n1,{ minLevel: 0,maxLevel: 2,relationshipFilter: 'ACTED_IN',labelFilter: '+Movie|Person'})
    Yield nodes,relationships
    Return nodes,relationships
";

var movies = new List<Movie>();
var people = new List<People>();

var session = client.Driver.AsyncSession();
var res = await session.RunAsync(queryStr);
await res.FetchAsync();
    
foreach (var node in res.Current.Values["nodes"].As<List<INode>>())
{
    //Assumption of one label per node.
    switch(node.Labels.Single().ToLowerInvariant()){
        case "movie":
            movies.Add(new Movie(node));
            break;
        case "person":
            /* similar to above */
            break;
        default:
            throw new ArgumentOutOfRangeException("node",node.Labels.Single(),"Unknown node type");
    }
}

其中Movie等定义为:

public class Movie {
    public long Id {get;set;}
    public string Title {get;set;}
    
    public Movie(){}
    public Movie(INode node){
        Id = node.Id;
        Title = node.Properties["title"].As<string>();
    }
}

我需要研究如何解决客户端的不退回ID等问题,但这是达到目标的最快方法。

>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res