在 MacOS X 环境上通过 Virtuoso 的 ODBC/iODBC 将 Redland 连接到 Virtuoso
Connecting Redland to Virtuoso through Virtuoso's ODBC/iODBC on MacOS X Environment
为了在我的 MacOS X 环境中安装 Virtuoso,我使用了 brew 端口,即:
brew install virtuoso
通过这样做,它会自动安装一些 ODBC/iODBC 驱动程序,这些驱动程序不能被任何其他 unixodbc 安装程序覆盖。特别是如果我尝试 link 这样的库:
$ brew link unixodbc
Linking /usr/local/Cellar/unixodbc/2.3.4...
Error: Could not symlink bin/isql
Target /usr/local/bin/isql
is a symlink belonging to virtuoso. You can unlink it:
brew unlink virtuoso
To force the link and overwrite all conflicting files:
brew link --overwrite unixodbc
To list all files that would be deleted:
brew link --overwrite --dry-run unixodbc
顺便说一句,我不想取消link这个版本。所以我尝试从头开始编译 Redland 并从 GitHub 下载它。特别是,我使用了两种可能的配置:
env PKG_CONFIG_PATH=/usr/local/lib/pkgconfig ./configure --with-virtuoso --with-odbc=/usr/local/Cellar/virtuoso/7.2.4.2
env PKG_CONFIG_PATH=/usr/local/lib/pkgconfig ./configure --with-virtuoso --with-iodbc=/usr/local/Cellar/virtuoso/7.2.4.2
在我的项目中手动添加 rdf_hash_internal.h
和 rdf_heuristics.h
之后,一切都进行得很顺利,所有内容都得到了编译和 linked。在我的 C++ 应用程序中,我尝试使用以下代码访问数据库:
world = librdf_new_world();
librdf_world_open(world);
storage = librdf_new_storage(world,"virtuoso",graphName.c_str(),"dsn='Local Virtuoso',user='dba',password='dba'");
model = librdf_new_model(world,storage,NULL);
context_node = librdf_new_node_from_uri_string(world,(const unsigned char*)defaultContext.c_str());
/* librdf_model_transaction_commit(this->super->model) */
librdf_model_size(super->model)
无论我是否禁用事务,无论如何我在 "rdf_storage_virtuoso.c" 的第 941 行收到以下错误:
rc = SQLDriverConnect(connection->hdbc, 0,(UCHAR *) context->conn_str,
SQL_NTS, context->outdsn,
LIBRDF_VIRTUOSO_CONTEXT_DSN_SIZE,
&buflen, SQL_DRIVER_COMPLETE);
因此,我认为 ODBC/iODBC 级别存在连接错误。顺便说一句,我可以使用以下命令连接到 virtuoso:
$ isql localhost:1111 dba dba
Connected to OpenLink Virtuoso
Driver: 07.20.3217 OpenLink Virtuoso ODBC Driver
OpenLink Interactive SQL (Virtuoso), version 0.9849b.
Type HELP; for help and EXIT; to exit.
SQL>
Virtuoso有什么方法可以连接Redland库和ODBC库吗?提前致谢。
我不太了解 brew,但是是否可以修改它的包定义以便它重命名我们的 isql 二进制文件,例如改用 isql-vt?
我们已经通过调用
在我们的 Debian/Ubuntu 包装中做到了这一点
./configure --program-transform-name='s/isql$$/isql-vt/;s/isqlw/isqlw-vt/'
参见 https://github.com/openlink/virtuoso-opensource/blob/develop/7/debian/rules#L31
我没有看到您从第 941 行收到的错误,但有两点与 ODBC 连接有关:
1) 你的 --with-iodbc=
必须指向 iodbc 的副本,而不是 virtuoso(你可以从 http://iodbc.org/ 获得它,或者你的发行版可能有一个包,例如 debian/ubuntu 上的 libiodbc2-dev)
2) Virtuoso 的 isql
测试与 virtuoso 的直接联系;要检查驱动程序管理器是否配置正确,请使用 iodbctest
(或首先导致上述冲突的 unixODBC 的 isql
)。
首先,iODBC is the ODBC driver manager Apple builds into OS X, and users are usually better off sticking with it -- though we (OpenLink Software, maintainers of iODBC) do recommend updating to the curent version,因为 Apple 通常落后很多更新。
与此相关,Apple 并未捆绑 full iODBC SDK。他们遗漏了框架等。
一般来说,UnixODBC 没有与 GUI-space OS X 应用程序或驱动程序完全集成,并且随着时间的推移还会出现各种其他问题。当前的 iODBC 不关心您是在 GUI 还是命令行、Carbon 或 Cocoa、32 位或 64 位中工作...它都可以正常工作(并且 if it doesn't work, we want to know, so we can fix it)。
我用过的 MacPorts 和其他打包器有办法在 UnixODBC 和 iODBC 之间切换(例如,variants
);我无法快速找到 Homebrew 的相关内容,但也许你可以?
所有这些问题都是由于配置问题造成的AFIK 没有在指南中描述(如果我错了请纠正我,我想找到关于这两个方面的更多详细信息Virtuoso 和 Redland/librdf)。因此,正如我在评论中所说,问题出在 ODBC 中,但原因是没有 Virtuoso 指南中没有提到如何配置他们的驱动程序。这是要走的路:
/Library/ODBC/odbc.ini
[ODBC Data Sources]
VOS = virtuoso-odbc
[VOS]
Driver = /usr/local/Cellar/virtuoso/7.2.4.2/lib/virtodbc.so
Description = Virtuoso Open-Source Edition
Address = localhost:1111
UserName = dba
User = dba
/Library/ODBC/odbcinst.ini
[ODBC Drivers]
virtuoso-odbc = Installed
[virtuoso-odbc]
Driver = /usr/local/Cellar/virtuoso/7.2.4.2/lib/virtodbc.so
因此,连通过 Redland 访问所需的配置参数也必须更改。
storage=librdf_new_storage(world, "virtuoso","db1","dsn='VOS',user='dba',password='dba'");
其中VOS是ODBC中的配置定义。
而且,具体的ContextNode指定了哪个是要使用的Named Graph。
为了在我的 MacOS X 环境中安装 Virtuoso,我使用了 brew 端口,即:
brew install virtuoso
通过这样做,它会自动安装一些 ODBC/iODBC 驱动程序,这些驱动程序不能被任何其他 unixodbc 安装程序覆盖。特别是如果我尝试 link 这样的库:
$ brew link unixodbc
Linking /usr/local/Cellar/unixodbc/2.3.4...
Error: Could not symlink bin/isql
Target /usr/local/bin/isql
is a symlink belonging to virtuoso. You can unlink it:
brew unlink virtuoso
To force the link and overwrite all conflicting files:
brew link --overwrite unixodbc
To list all files that would be deleted:
brew link --overwrite --dry-run unixodbc
顺便说一句,我不想取消link这个版本。所以我尝试从头开始编译 Redland 并从 GitHub 下载它。特别是,我使用了两种可能的配置:
env PKG_CONFIG_PATH=/usr/local/lib/pkgconfig ./configure --with-virtuoso --with-odbc=/usr/local/Cellar/virtuoso/7.2.4.2
env PKG_CONFIG_PATH=/usr/local/lib/pkgconfig ./configure --with-virtuoso --with-iodbc=/usr/local/Cellar/virtuoso/7.2.4.2
在我的项目中手动添加 rdf_hash_internal.h
和 rdf_heuristics.h
之后,一切都进行得很顺利,所有内容都得到了编译和 linked。在我的 C++ 应用程序中,我尝试使用以下代码访问数据库:
world = librdf_new_world();
librdf_world_open(world);
storage = librdf_new_storage(world,"virtuoso",graphName.c_str(),"dsn='Local Virtuoso',user='dba',password='dba'");
model = librdf_new_model(world,storage,NULL);
context_node = librdf_new_node_from_uri_string(world,(const unsigned char*)defaultContext.c_str());
/* librdf_model_transaction_commit(this->super->model) */
librdf_model_size(super->model)
无论我是否禁用事务,无论如何我在 "rdf_storage_virtuoso.c" 的第 941 行收到以下错误:
rc = SQLDriverConnect(connection->hdbc, 0,(UCHAR *) context->conn_str,
SQL_NTS, context->outdsn,
LIBRDF_VIRTUOSO_CONTEXT_DSN_SIZE,
&buflen, SQL_DRIVER_COMPLETE);
因此,我认为 ODBC/iODBC 级别存在连接错误。顺便说一句,我可以使用以下命令连接到 virtuoso:
$ isql localhost:1111 dba dba
Connected to OpenLink Virtuoso
Driver: 07.20.3217 OpenLink Virtuoso ODBC Driver
OpenLink Interactive SQL (Virtuoso), version 0.9849b.
Type HELP; for help and EXIT; to exit.
SQL>
Virtuoso有什么方法可以连接Redland库和ODBC库吗?提前致谢。
我不太了解 brew,但是是否可以修改它的包定义以便它重命名我们的 isql 二进制文件,例如改用 isql-vt?
我们已经通过调用
在我们的 Debian/Ubuntu 包装中做到了这一点./configure --program-transform-name='s/isql$$/isql-vt/;s/isqlw/isqlw-vt/'
参见 https://github.com/openlink/virtuoso-opensource/blob/develop/7/debian/rules#L31
我没有看到您从第 941 行收到的错误,但有两点与 ODBC 连接有关:
1) 你的 --with-iodbc=
必须指向 iodbc 的副本,而不是 virtuoso(你可以从 http://iodbc.org/ 获得它,或者你的发行版可能有一个包,例如 debian/ubuntu 上的 libiodbc2-dev)
2) Virtuoso 的 isql
测试与 virtuoso 的直接联系;要检查驱动程序管理器是否配置正确,请使用 iodbctest
(或首先导致上述冲突的 unixODBC 的 isql
)。
首先,iODBC is the ODBC driver manager Apple builds into OS X, and users are usually better off sticking with it -- though we (OpenLink Software, maintainers of iODBC) do recommend updating to the curent version,因为 Apple 通常落后很多更新。
与此相关,Apple 并未捆绑 full iODBC SDK。他们遗漏了框架等。
一般来说,UnixODBC 没有与 GUI-space OS X 应用程序或驱动程序完全集成,并且随着时间的推移还会出现各种其他问题。当前的 iODBC 不关心您是在 GUI 还是命令行、Carbon 或 Cocoa、32 位或 64 位中工作...它都可以正常工作(并且 if it doesn't work, we want to know, so we can fix it)。
我用过的 MacPorts 和其他打包器有办法在 UnixODBC 和 iODBC 之间切换(例如,variants
);我无法快速找到 Homebrew 的相关内容,但也许你可以?
所有这些问题都是由于配置问题造成的AFIK 没有在指南中描述(如果我错了请纠正我,我想找到关于这两个方面的更多详细信息Virtuoso 和 Redland/librdf)。因此,正如我在评论中所说,问题出在 ODBC 中,但原因是没有 Virtuoso 指南中没有提到如何配置他们的驱动程序。这是要走的路:
/Library/ODBC/odbc.ini
[ODBC Data Sources]
VOS = virtuoso-odbc
[VOS]
Driver = /usr/local/Cellar/virtuoso/7.2.4.2/lib/virtodbc.so
Description = Virtuoso Open-Source Edition
Address = localhost:1111
UserName = dba
User = dba
/Library/ODBC/odbcinst.ini
[ODBC Drivers]
virtuoso-odbc = Installed
[virtuoso-odbc]
Driver = /usr/local/Cellar/virtuoso/7.2.4.2/lib/virtodbc.so
因此,连通过 Redland 访问所需的配置参数也必须更改。
storage=librdf_new_storage(world, "virtuoso","db1","dsn='VOS',user='dba',password='dba'");
其中VOS是ODBC中的配置定义。 而且,具体的ContextNode指定了哪个是要使用的Named Graph。